EntityFramework迁移尝试创建已存在的数据库。

11
我们正在将一个简单的ASP.NET MVC应用程序部署到我们的一个暂存服务器上,当EntityFramework尝试迁移现有数据库时,我们遇到了以下错误。
CREATE DATABASE permission denied in database 'master'. 

情况如下:

  • 这是迁移首次运行。
  • 数据库已经存在(实际上是一个 Umbraco 数据库)。

很明显,以下方法(来自 EntityFramework)的返回值为 false,但它应该返回 true:

System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists() 

数据库初始化器有以下代码:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>());

由于我们使用基于代码的迁移,因此关闭了自动迁移。

连接字符串指向正确的数据库,并且用户对该数据库具有db_owner权限。用户没有访问服务器上其他表的权限。

这是一个常见的问题吗? 有人知道解决方法吗?

谢谢!


1
你能否尝试将其设置为非主数据库,因为这是系统数据库的名称,可能会引起问题。 - Andy Stannard
连接字符串中的数据库名称不是 master(因为这确实是一个系统数据库)。它是一个现有的数据库,用户只有该数据库的权限。EntityFramework 尝试创建数据库,因为 EnsureDatabaseExists 报告说没有数据库。之后 EF 尝试创建数据库,但用户没有权限。然而,这并不是问题所在。由于某种原因,EF 无法检测到该数据库实际上已经存在。 - Floris Robbemont
1
如链接问题所述,这可能是后续问题。该帐户必须具有查询主数据库的权限,以检查您的数据库是否存在。 - Ladislav Mrnka
可能是EF需要创建一个临时数据库来执行迁移。你能给它sa权限,然后使用SQL Profiler观察它的操作吗? - PilotBob
1个回答

3
确保数据库存在 - 执行以下脚本
IF db_id(N'MyDatabaseName') IS NOT NULL SELECT 1 ELSE SELECT Count(*) FROM sys.databases WHERE [name]=N'MyDatabaseName'

这里假设用户拥有查询'sys.databases'以获取数据库列表的权限。如果此查询失败,则EF认为数据库尚未创建并尝试重新创建。

请确保执行迁移的用户能够成功执行以上查询。


有用,但你是怎么弄明白的呢?另外,我们能不能让EF停止这样做,这对于一个安全环境来说不合适 :) - O'Rooney
弄清楚这个问题 - 嗯...从标准SQL数据库创建脚本中使用了一段SQL代码,这是SSMS生成的。我们如何阻止EF尝试创建数据库?我认为可以。只需创建一个自定义的DB初始化程序,而不是依赖于开箱即用的默认实现。 - Marty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接