Entity framework 运行DbMigrator的EF代码首次迁移。更新失败
在我的ASP.NET MVC Web应用程序中,首先使用EF迁移,由EF代码支持,我需要更好地控制数据库更新,使其半自动。目标是仅从代码运行它们(例如,通过运行Entity framework 运行DbMigrator的EF代码首次迁移。更新失败,entity-framework,entity-framework-6,entity-framework-migrations,Entity Framework,Entity Framework 6,Entity Framework Migrations,在我的ASP.NET MVC Web应用程序中,首先使用EF迁移,由EF代码支持,我需要更好地控制数据库更新,使其半自动。目标是仅从代码运行它们(例如,通过运行DbMigrator.Update()),但如果不运行,应用程序仍应执行,忽略可能的更改 为了实现这一点,我将DbMigrationsConfiguration.automaticmmigrationsenabled设置为false,但在第一次访问数据库时,我遇到了以下异常: System.Data.Entity.Migrations.I
DbMigrator.Update()
),但如果不运行,应用程序仍应执行,忽略可能的更改
为了实现这一点,我将DbMigrationsConfiguration.automaticmmigrationsenabled
设置为false
,但在第一次访问数据库时,我遇到了以下异常:
System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException:“无法更新数据库以匹配当前模型,因为存在挂起的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMiggrationsEnabled设置为true以启用自动迁移。”
好的方面:我可以通过在Web.config
中设置disableDatabaseInitialization=“true”
来忽略异常(我没有找到任何其他工作方式)
我正在自定义触发器上运行以下代码:
var config = new DbMigrationsConfiguration<MyContext>
{
AutomaticMigrationsEnabled = false,
AutomaticMigrationDataLossAllowed = false,
MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
MigrationsNamespace = typeof(InitialCreate).Namespace
};
var migrator = new DbMigrator(config);
migrator.Update(); // throws Exception
var config=new dbmigtorinsconfiguration
{
AutomaticMiggerationsEnabled=false,
AutomaticMigrationDataLossAllowed=false,
MigrationAssembly=Assembly.GetAssembly(typeof(InitialCreate)),
MigrationNamespace=typeof(InitialCreate).Namespace
};
var migrator=新的DbMigrator(配置);
migrator.Update();//抛出异常
更新调用抛出:
System.Data.SqlClient.SqlException:“数据库中已经有一个名为“MyEntity”的对象。”
这可能与使用disableDatabaseInitialization
有关。另外,调用migrator.GetLocalMigrations()
会列出所有迁移,但migrator.GetDatabaseMigrations()
不会列出任何迁移(空),因为已经应用了一些迁移
你能发现错误吗?经过多次尝试后,我发现自己丢失的
ContextKey
属性导致了以下问题:
var config = new DbMigrationsConfiguration<MyContext>
{
AutomaticMigrationsEnabled = false,
AutomaticMigrationDataLossAllowed = false,
MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
MigrationsNamespace = typeof(InitialCreate).Namespace,
ContextKey = nameof(MyContext) // Fixed the issue
};
var config=new dbmigtorinsconfiguration
{
AutomaticMiggerationsEnabled=false,
AutomaticMigrationDataLossAllowed=false,
MigrationAssembly=Assembly.GetAssembly(typeof(InitialCreate)),
MigrationNamespace=typeof(InitialCreate).Namespace,
ContextKey=nameof(MyContext)//修复了这个问题
};
很有趣,我必须自己设置所有字段。在我找到的示例中,人们不需要设置任何东西。对我来说,缺少的是
migrationassembly
和migrationnamespace
。我已经有了ContextKey
,但它是硬编码的。我有一个现有的数据库。我想我应该使用你的nameof
,因为它更干净,但它不会返回与硬编码相同的字符串,因此我最终发现数据库中已经存在实体的错误。