Entity framework 如何从头开始重新创建迁移
我最近从EF6 alpha 1-3升级到EF6 beta 1。这意味着我必须重新创建使用alpha版本创建的所有迁移 因此,我尝试回滚到使用EF5创建的迁移。但我发现在表上引入外键约束可能会导致循环或多个级联路径。我想这是因为我在为完全相同的问题准备迁移时忽略了修复迁移。(应该读过) 无论如何,我并没有试图解决所有问题,而是试图重置所有迁移—如前所述。我删除了数据库中的migrations表和所有migration.cs文件,然后在package manager中启用migrations-EnableAutomaticMigrations-Force和Entity framework 如何从头开始重新创建迁移,entity-framework,entity-framework-migrations,Entity Framework,Entity Framework Migrations,我最近从EF6 alpha 1-3升级到EF6 beta 1。这意味着我必须重新创建使用alpha版本创建的所有迁移 因此,我尝试回滚到使用EF5创建的迁移。但我发现在表上引入外键约束可能会导致循环或多个级联路径。我想这是因为我在为完全相同的问题准备迁移时忽略了修复迁移。(应该读过) 无论如何,我并没有试图解决所有问题,而是试图重置所有迁移—如前所述。我删除了数据库中的migrations表和所有migration.cs文件,然后在package manager中启用migrations-Ena
添加migration Initial
当我尝试使用现有的数据库初始化器(自动迁移为false)运行应用程序时,它失败了,因为它试图创建已经存在的表。因此,我将初始化器更改为
Database.SetInitializer(新的DropCreateDatabaseAlways())
这一次,我发现在表上引入外键约束可能会在初始化过程中再次导致循环或多个级联路径问题
因此,我将迁移文件中的所有cascadeDelete:true
更改为cascadeDelete:false
但我还是犯了同样的错误
更新1我删除了迁移文件中除创建1个表之外的所有内容,但得到了相同的错误。某个地方一定有某种缓存,或者它正在提取一个我不知道的文件,或者它正在后台生成自己的迁移
更新2我认为,当使用DropCreateDatabaseAlways
时,EF必须始终生成迁移,而且在迁移文件中将cascadeDelete
更改为false是错误的。这应该在FluentAPI中完成。所以我添加了这一行modelBuilder.Conventions.Remove()代码>在模型创建时打开。我还删除了初始迁移文件。然后我运行应用程序,它正确地生成了一个数据库。我以为我已经破解了,但是
我更改了初始化以使用原始配置文件:
internal sealed class Configuration : DbMigrationsConfiguration<SID2013Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
}
protected override void Seed(etc..
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=假;
AutomaticMigrationDataLossAllowed=true;
}
受保护的覆盖无效种子(等)。。
}
然后我运行应用程序,它报告模型已经更改,所以我添加了迁移更新数据库,并创建了一个迁移文件来创建数据库
现在的问题是,当我运行应用程序时,它会尝试运行另一个更新(即使AutomaticMigrationsEnabled=false)问题再次出现。迁移表中有一个条目与配置文件的名称不匹配。如果要使用现有数据库启动“代码优先迁移”工作,可以执行以下操作:
我运行添加迁移“InitialMigrations”
它探索现有数据库并将其作为迁移步骤
暂时删除“初始迁移”步骤的内容:
我运行更新数据库
这将在表uu MigrationHistory中创建相应的条目
恢复“InitialMigration”的内容,以便在空数据库上正常工作
就这样
更新:初始值设定项
据我所知,“DropCreateDatabaseAlways”总是删除并创建数据库。这只能用于第一次安装。如果安装启动板正常工作,则会擦除所有数据。这就是我为什么这么做的原因
我基于这篇文章:coding.abel.nu/2012/03/…我自己使用的初始值设定项。我会写的
seed肯定会执行,因此此方法会产生相同的结果,但即使您不运行安装,而是运行升级,它也会工作
public partial class MyEntities : DbContext
{
static MyEntities()
{
Database.SetInitializer<MyEntities>(new ValidateDatabase<MyEntities>());
}
}
/// <summary>
/// http://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/
/// </summary>
/// <typeparam name="TContext"></typeparam>
public class ValidateDatabase<TContext> : IDatabaseInitializer<TContext>
where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
if (!context.Database.Exists())
{
throw new ConfigurationErrorsException(
"Database does not exist");
}
else
{
if (!context.Database.CompatibleWithModel(true))
{
//from:
//http://stackoverflow.com/questions/11611322/ef-4-3-code-first-migrations-seed-per-migration
var cfg = new Migrations.Configuration();
var migrator = new DbMigrator(cfg);
///Last in the db, (first, the reverse order)
var dbLast = migrator.GetDatabaseMigrations().FirstOrDefault();
///last in the app
var appLast = migrator.GetLocalMigrations().LastOrDefault();
///what is missing
var pendings = string.Join(", ", migrator.GetPendingMigrations());
throw new InvalidOperationException(
string.Format("The database ({0}) is not compatible with the entity model ({1}). Pending migrations: {2}",
dbLast, appLast, pendings));
}
}
}
}
公共部分类myenties:DbContext
{
静态髓质()
{
SetInitializer(新的ValidateDatabase());
}
}
///
/// http://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/
///
///
公共类ValidateDatabase:IDatabaseInitializer
其中TContext:DbContext
{
public void InitializeDatabase(TContext上下文)
{
如果(!context.Database.Exists())
{
抛出新的ConfigurationErrorsException(
“数据库不存在”);
}
其他的
{
如果(!context.Database.CompatibleWithModel(true))
{
//发件人:
//http://stackoverflow.com/questions/11611322/ef-4-3-code-first-migrations-seed-per-migration
var cfg=new Migrations.Configuration();
var migrator=新的DbMigrator(cfg);
///数据库中的最后一个(第一个,顺序相反)
var dbLast=migrator.GetDatabaseMigrations().FirstOrDefault();
///应用程序中的最后一个
var appLast=migrator.GetLocalMigrations().LastOrDefault();
///缺少什么
var pendings=string.Join(“,”,migrator.GetPendingMigrations());
抛出新的InvalidOperationException(
Format(“数据库({0})与实体模型({1})不兼容。挂起的迁移:{2}”,
dbLast、appLast、pendings);
}
}
}
}
更新:设置
安装我使用的是这样的东西:
我最终通过手动删除数据库,然后使用原始的MigrateDatabaseToLatestVersion
初始值设定项运行应用程序来解决这个问题。我没有意识到如果它
public partial class MyEntities : DbContext
{
static MyEntities()
{
Database.SetInitializer<MyEntities>(new ValidateDatabase<MyEntities>());
}
}
/// <summary>
/// http://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/
/// </summary>
/// <typeparam name="TContext"></typeparam>
public class ValidateDatabase<TContext> : IDatabaseInitializer<TContext>
where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
if (!context.Database.Exists())
{
throw new ConfigurationErrorsException(
"Database does not exist");
}
else
{
if (!context.Database.CompatibleWithModel(true))
{
//from:
//http://stackoverflow.com/questions/11611322/ef-4-3-code-first-migrations-seed-per-migration
var cfg = new Migrations.Configuration();
var migrator = new DbMigrator(cfg);
///Last in the db, (first, the reverse order)
var dbLast = migrator.GetDatabaseMigrations().FirstOrDefault();
///last in the app
var appLast = migrator.GetLocalMigrations().LastOrDefault();
///what is missing
var pendings = string.Join(", ", migrator.GetPendingMigrations());
throw new InvalidOperationException(
string.Format("The database ({0}) is not compatible with the entity model ({1}). Pending migrations: {2}",
dbLast, appLast, pendings));
}
}
}
}