Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 运行DbMigrator的EF代码首次迁移。更新失败_Entity Framework_Entity Framework 6_Entity Framework Migrations - Fatal编程技术网

Entity framework 运行DbMigrator的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

在我的ASP.NET MVC Web应用程序中,首先使用EF迁移,由EF代码支持,我需要更好地控制数据库更新,使其半自动。目标是仅从代码运行它们(例如,通过运行
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
,因为它更干净,但它不会返回与硬编码相同的字符串,因此我最终发现数据库中已经存在实体的错误。