首页 > 解决方案 > 如何处理实体框架模型而不丢失生产部署中的先前数据?

问题描述

最初我使用 EF 6 代码优先方法在 LocalDB(基于服务的数据库)中创建表。代码是:

namespace WindowsFormsApp2
{
   public class MyDBContext : DbContext
   {
    public MyDBContext() : base("name=strCon")
    {
        AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
        Database.SetInitializer<MyDBContext>(new DropCreateDatabaseIfModelChanges<MyDBContext>());
        //Database.SetInitializer<MyDBContext>(null);
        //Database.SetInitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>());
    }
    public DbSet<Assets> Assets { get; set; }
}
}

LocalDB 的 App.config 中的连接字符串

 <connectionStrings>
 <add name="strCon" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\AppDB.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />
 </connectionStrings>

我的目标是在客户端机器上部署(发布)最新的模型更改,而不会丢失表中以前的数据。数据库迁移应该以编程方式执行。但是数据库初始化DropCreateDatabaseIfModelChanges程序是 DELETE,在数据库上重新创建。EF6 是否有可能在不删除、重新创建的情况下自动处理这样的基本模型更改?

标签: c#winformsentity-framework-6localdb

解决方案


您正在使用 DropCreateDatabaseIfModelChanges 初始化上下文。顾名思义,如果模型发生更改,它会完全删除数据库并重新创建它。如果这不是所需的操作,您应该使用 CreateDatabaseIfNotExists 之类的东西来维护现有数据。


推荐阅读