如何解决如何处理实体框架模型而不会丢失生产部署中的先前数据?
最初我使用 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; }
}
}
App.config 中 LocalDB 的连接字符串
<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、RECREATING。
有没有可能EF6还没有自动处理这种基本的模型变化而不删除,重新创建?
解决方法
您正在使用 DropCreateDatabaseIfModelChanges 初始化您的上下文。顾名思义,如果模型发生变化,它会完全删除数据库并重新创建它。如果这不是您想要的操作,您应该使用类似 CreateDatabaseIfNotExists 的方法来维护现有数据。
,解决办法如下:
Entity Framework 中的自动迁移应自动执行模型更改,而不会丢失开发或生产或 LocalDB 中的数据。
namespace WindowsFormsApp3
{
public class MyDBContext:DbContext
{
public MyDBContext() : base("name=strCon") {
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext,WindowsFormsApp3.Migrations.Configuration>());
}
public DbSet<Employee> Employee { get; set; }
}
}
您应该在包管理控制台中运行 Enable-Migrations
以生成 Configuration.cs 文件。
这是我的 Configuration.cs 文件中的代码。
namespace WindowsFormsApp3.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<WindowsFormsApp3.MyDBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
protected override void Seed(WindowsFormsApp3.MyDBContext context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
}
对于 Service-based database
,您需要将 .mdf
文件属性 Copy to output Directory
从 Copy if newer
设置为 Copy always
。
App.config 文件中的连接字符串:
<connectionStrings>
<add name="strCon" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\WinForms3.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />
</connectionStrings>
现在,您可以在模型类中添加或修改实体。您无需在包管理器控制台中运行任何命令。
重要
请注意,您必须在 Configuration 类构造函数中将 AutomaticMigrationDataLossAllowed
设置为 true
,连同 AutomaticMigrationsEnabled = true;
这两个选项应该处理相应列异常种类或场景中的数据丢失。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。