使用禁用自动迁移的Entity Framework 6自动创建数据库

4
如果使用Code First EF6,并禁用自动迁移,我希望能够自动创建一个新数据库(如果不存在)。在Entity Framework中自动迁移出现之前,这种方法非常有效。但是,在EF6中,您会收到以下异常信息:“System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException”,提示无法更新数据库以匹配当前模型,因为存在未处理的更改且自动迁移被禁用。要解决此问题,请将待处理的模型更改写入基于代码的迁移或启用自动迁移。请将“DbMigrationsConfiguration.AutomaticMigrationsEnabled”设置为true以启用自动迁移。为了验证此异常不是由生产项目中的外部因素引起的,可以创建一个新的测试项目。对于我的数据库上下文,我有:
public class MyContext : DbContext
{
    public DbSet<Entity> Entities { get; set; }

    public MyContext()
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
    }
}

然后我添加了一个数据库迁移配置文件,以禁用自动迁移:

public class DatabaseConfiguration : DbMigrationsConfiguration<MyContext>
{
    public DatabaseConfiguration()
    {
        this.AutomaticMigrationsEnabled = false;
    }
}

如果没有数据库,我只需要能够创建一个新的数据库(这样我就可以在我的开发机器上快速删除并重新创建一个新的数据库以进行快速开发)。但是,我不想启用自动迁移,因为我们使用第三方工具在生产中进行迁移,如果启用了自动迁移且模式已更改,EF6会报错。
如果有任何见解或其他解决方案来满足这些需求,将不胜感激。谢谢!

你还在使用Code First迁移来跟踪模型更改吗? - jjj
不,我们正在使用Red Gate SQL Compare来跟踪数据库架构的更改。 - Matthew Renze
但是你仍然有一个迁移文件夹和一个 DbMigrationsConfiguration 吗? - jjj
不,无论是在Visual Studio还是文件系统中都没有迁移文件夹。我创建了DbMigrationsConfiguration子类来禁用自动迁移。据我所知,从未启用或使用过Code-First迁移。 - Matthew Renze
1个回答

5
也许你可以...
  1. Set the database initializer to null (to disable the check for model compatibility)

    public class MyContext : DbContext
    {
        static MyContext()
        {
            Database.SetInitializer<MyContext>(null);
        }
    }
    
  2. Explicitly call MyContext.Database.CreateIfNotExists() at an appropriate time of your choosing.

编辑

如果您没有使用 Code First Migrations,那么似乎您需要删除 DbMigrationsConfiguration

在运行时,Code First 查找与上下文相关联的 DbMigrationsConfiguration 类,当该上下文经过其数据库初始化过程时。如果找到该类,则任何显式调用或设置以将数据库初始化设置为任何原始三个初始化程序之一 - 其工作是创建或删除并创建数据库 - 将使用迁移创建数据库。

https://msdn.microsoft.com/en-us/magazine/dn818489.aspx

我认为即使您不使用初始化程序,它也必须做同样的事情。


我刚刚尝试了你的建议,但它仍然抛出相同的异常。 - Matthew Renze
@MatthewRenze:很可能不是引起异常的原因(因为我相信你一定已经添加了它才能让它工作)——但我忘记了类型参数。无论如何,我不确定为什么你仍然会得到那个异常。你以前在这个项目上使用过Code First迁移吗? - jjj
当我测试你的代码时,我直接将它复制粘贴到一个从未使用过Code-First迁移的新测试项目中。因此,这个项目以前没有使用过Code-First迁移。另外,正如你指出的那样,当智能感知提示我添加缺少的类型参数时,我确实添加了它。你能在一个隔离的测试项目中让你的代码示例工作吗? - Matthew Renze
我从头再试了一次,但它似乎仍然无法工作(即我仍然得到相同的异常)。我使用gist在github上发布了我正在使用的代码,网址如下。你愿意看一下,看看我是否与你所做的有所不同吗?谢谢!https://gist.github.com/matthewrenze/8101479dcc28d343c874 - Matthew Renze
太好了!问题解决了!非常感谢您花时间和精力帮助我解决这个问题。 - Matthew Renze
显示剩余2条评论

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