实体框架代码优先迁移策略与现有数据库

我有以下情况,无法确定正确的迁移策略。帮助就是感激

  • 应用程序创建并使用数据库作为数据存储
  • 如果需要,应用程序需要在启动时更新数据库
  • 使用Nuget Manager控制台是不可取的。(出于迁移目的,本地无问题)
  • 我在发行版中有一个不属于EF的现有数据库

现在我想开始使用EF代码优先的方法。我需要实现的是:

  1. 如果没有数据库,则创建一个
  2. 如果数据库存在,请使用空迁移(为下一次升级做好准备)
  3. 这应该发生在应用程序启动时

数据库不存在===>创建EF初始====>Upg v1=====>Upg V2

数据库存在===>跳过初始设置,但为下一次升级做好准备===>Upg v1=====>Upg v2

谢谢你的帮助

其他信息:
这是现有的数据库(只是一个示例):

创建数据库测试

使用测试

创建模式[TestSchema]授权[dbo]

创建表[TestSchema]。[Table1](
[Id][uniqueidentifier]不为空,
[Column1][nvarchar](500)不为空,
[Column2][bit]不为空,
[Column3][bit]不为空,
约束[PK_监视器组]主键群集
(
[Id]ASC
)At[主]上打开(PAD\u INDEX=OFF,STATISTICS\u norecocomputer=OFF,IGNORE\u DUP\u KEY=OFF,ALLOW\u ROW\u LOCKS=ON,ALLOW\u PAGE\u LOCKS=ON)
)At[小学]

使用反向工程EF创建初始迁移:

公共部分类首字母:DbMigration
{
公共覆盖作废()
{
创建表(
“TestSchema.Table1”,
c=>新
{
Id=c.Guid(可空:false),
Column1=c.String(可空:false,maxLength:500),
Column2=c.Boolean(可空:false),
Column3=c.Boolean(可为空:false),
})
.PrimaryKey(t=>t.Id);
}
公共覆盖无效向下()
{
DropTable(“TestSchema.Table1”);
}
}

如果我对不存在的数据库使用@spender提供的代码,一切都很酷。
如果我对现有数据库使用它,它将一直工作,直到我更改模型(下一次迁移)

我看到的是,迁移返回的升级脚本包含整个数据库创建过程。并且不能对已经存在的对象执行

实际可行的方法是将迁移表添加到现有数据库并添加初始数据,但我不确定这是否是一个好的解决方案

我花了相当长的时间才弄明白,所以我很高兴在这里与大家分享

因此,首先需要对数据库进行反向工程。实体框架电动工具可以为您做到这一点。安装完成后,在您的项目中,使用nuget安装EF,右键单击解决方案资源管理器中的项目节点,然后实体框架->首先反向工程代码。这将生成一大堆模型类,并将类映射到您的项目

接下来,在包管理器控制台中

启用迁移

然后

添加迁移初始值

创建描述从空数据库到当前架构转换的迁移

现在编辑生成的Configuration.cs类构造函数:

公共配置()
{
AutomaticMiggerationsEnabled=假;
AutomaticMigrationDataLossAllowed=false;
}

接下来,在应用程序启动时(如果您是从Web服务器运行的,那么可能在global.asaxApplication\u Start),您需要触发迁移。此方法将完成以下工作:

公共静态void ApplyDatabaseMigrations()
{
//Configuration是由Enable Migrations创建的类
dbmigtionsconfiguration dbMgConfig=新配置()
{
//EF power tools生成的DbContext子类
ContextType=typeof(MyDbContext)
};
使用(var-databaseContext=new MyDbContext())
{
尝试
{
var database=databaseContext.database;
var migrationConfiguration=dbMgConfig;
migrationConfiguration.TargetDatabase=
新的DbConnectionInfo(database.Connection.ConnectionString,
“System.Data.SqlClient”);
var migrator=新的DbMigrator(migrationConfiguration);
migrator.Update();
}
捕获(自动丢失检测adle)
{
dbMgConfig.AutomaticMigrationDataLossAllowed=true;
var mg=新的DbMigrator(dbMgConfig);
var scriptor=new MigratorScriptingDecorator(mg);
string script=scriptor.ScriptUpdate(null,null);
抛出新异常(adle.Message+:“+脚本);
}
}
}

现在,您可以像往常一样添加更多迁移。应用程序运行时,如果尚未应用这些迁移,则将在调用ApplyDatabaseMigrations时应用这些迁移

现在,您在EF代码第一次折叠中是对的。我想这就是你问的,对吗

发表评论