实体框架试图创建一个数据库,但这不是我想要的。

9
我有一个小的asp.net mvc4应用程序(在我的本地机器上工作正常),使用带有ADO.net DbContext Generator的实体框架v4.1.0.0。(SQL Server 2008 r2)
我通过Visual Studio 2010中的“添加可部署依赖项...”上下文菜单添加了较新版本的dll。
我有一个托管于godaddy.com的共享主机,我已将文件上传到服务器并创建了数据库,现在遇到了问题。当我尝试浏览我的网站时,我会收到以下错误:
在数据库'master'中拒绝了CREATE DATABASE权限。
我查阅了相关资料,发现这个错误是由EF代码优先尝试创建数据库引起的。但是我不想让EF代码优先重新创建数据库,如何完全关闭此自动数据库创建功能?我根本不打算使用Code-First功能。
请帮忙解决。
2个回答

24

将此代码放入Global.asax文件的Application_Start()方法或者DbContext类的构造函数中。

Database.SetInitializer<MyContext>(null);
如果您想在更改POCO domains时重新创建数据库,请使用以下代码而不是上面的代码。
Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());

我尝试在global.asax和构造函数中都放置了Database.SetInitializer<MyContext>(null);,但它没有起作用,我是否漏掉了什么? - nthapa
请检查您的Web应用程序中的连接字符串。我怀疑EF尝试创建的数据库与您已经创建的数据库不同。 - Ray
我在问题中没提到的是我也关注了这篇 Hanselman 的文章,关于通用提供程序,经过仔细检查堆栈跟踪后发现它也尝试创建 aspnet 成员资格和个人资料的数据库。因此,我现在已经回滚到 web.config 中较旧的 aspnet 成员资格和提供程序设置,并且现在它可以正常工作了,感谢 @Ray 的努力。 - nthapa
它起作用了。我必须为每个模型编写Database.SetInitializer<MyContext>(null);。 - Rahatur
1
6年后,这个方法在我的托管服务器上的MVC 4 Entity Framework 6项目中奏效了。传说! - Tim Tyler

2
如果您正在使用 EF 迁移,这就是您需要设置的内容:
public sealed class DbConfiguration : DbMigrationsConfiguration<DatabaseContext>
{
    public DbConfiguration()
    {
        AutomaticMigrationsEnabled = false;
    }
}

但这并没有回答关于EF Code First本身的问题。如果数据库已经存在,EF将不会尝试创建它。因此,您只需要将其指向现有的数据库。并确保连接字符串名称与数据库上下文的名称相同。如果不是,则需要使用一些覆盖来提供它:

public class DatabaseContext : DbContext
{
    public DatabaseContext() 
      : base(ApplicationParameters.ConnectionStringName)
    {
    }

    public DatabaseContext(string connectionStringName)
      : base(connectionStringName)
    {
    }

}

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