Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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
C# 实体框架6.0代码首次迁移-模型/数据库兼容性缺陷?_C#_Database_Entity Framework - Fatal编程技术网

C# 实体框架6.0代码首次迁移-模型/数据库兼容性缺陷?

C# 实体框架6.0代码首次迁移-模型/数据库兼容性缺陷?,c#,database,entity-framework,C#,Database,Entity Framework,在当前的项目中,我使用EntityFramework6.0Alpha3和代码优先的方法。我有一个自定义数据上下文,它在构造函数中使用DbConnection来访问它的数据库。我的迁移可以在VisualStudio中完成,也可以在运行时使用MigrationToLatestVersion初始值设定项完成 样本: public class MyStackOverflowSampleContext : DbContext { DbSet<Question> Questions {

在当前的项目中,我使用EntityFramework6.0Alpha3和代码优先的方法。我有一个自定义数据上下文,它在构造函数中使用DbConnection来访问它的数据库。我的迁移可以在VisualStudio中完成,也可以在运行时使用
MigrationToLatestVersion
初始值设定项完成

样本:

public class MyStackOverflowSampleContext : DbContext {

    DbSet<Question> Questions { get; set; }
    DbSet<Answers>  Answers   { get; set; }

    public MyStackOverflowSampleContext(DbConnection connection)
    : base(connection) { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.HasDefaultSchema("CRM");
        base.OnModelCreating(modelBuilder);
    }
}
。。。在这种情况下,这是错误的

如果我现在运行初始值设定项,而我的数据库还不可用,那么所有get都会按它应该的方式创建,并且
CompatibleWithModel
函数返回-如预期的那样:true

现在,出于测试目的,我先稍微更改了数据库,然后完全更改了数据库。我先删除一列,然后删除整个表,甚至是
\u MigrationsHistory

但无论我做什么:
\u dbContext.Database.CompatibleWithModel()
总是返回true!当我尝试初始化上下文时,会出现奇怪的错误,例如:“
表TabAnswers已经存在于数据库中。
”-即使它不再存在

但当我尝试更新以还原数据库时:“
当前没有挂起的更新…”


这是一个bug吗?

从实体框架的角度来看,您看到的行为是正确的,您只需假设实体框架比它更聪明

实体框架确定模型是否与数据库兼容的唯一方法是比较上下文存储的哈希值和存储在
\u MigrationsHistory
表中的has。这就是为什么删除列或表不会使
数据库。CompatibleWithModel
返回false-哈希值仍然相同


现在,当您删除
\u MigrationsHistory
时,您正在使实体框架认为您正在使用这种方法。从这一刻起,实体框架将假定是您负责保持数据库和模型同步。在这种情况下,方法的行为取决于
throwifNMetadata
参数的值。如果
throwIfNoMetadata
设置为true,则如果在与上下文关联的模型中或数据库本身中未找到模型元数据,则将引发异常。如果设置为false,那么如果找不到元数据,该方法将返回true。

从实体框架的角度来看,您看到的行为是正确的,您只需假设实体框架比它更聪明

实体框架确定模型是否与数据库兼容的唯一方法是比较上下文存储的哈希值和存储在
\u MigrationsHistory
表中的has。这就是为什么删除列或表不会使
数据库。CompatibleWithModel
返回false-哈希值仍然相同


现在,当您删除
\u MigrationsHistory
时,您正在使实体框架认为您正在使用这种方法。从这一刻起,实体框架将假定是您负责保持数据库和模型同步。在这种情况下,方法的行为取决于
throwifNMetadata
参数的值。如果
throwIfNoMetadata
设置为true,则如果在与上下文关联的模型中或数据库本身中未找到模型元数据,则将引发异常。如果设置为false,则如果未找到元数据,则该方法将返回true。

您的上下文类中似乎缺少默认的无参数构造函数。我还没有尝试过EF6,但在EF5中,MigrationToLatestVersion会抛出一个异常,说上下文是不可构造的。@WiktorZychla提供了一个无参数构造函数-我只是忘了在问题中包含它。但你是对的,这一个不会那样工作您的上下文类中似乎缺少默认的无参数构造函数。我还没有尝试过EF6,但在EF5中,MigrationToLatestVersion会抛出一个异常,说上下文是不可构造的。@WiktorZychla提供了一个无参数构造函数-我只是忘了在问题中包含它。但你是对的,这一个不会那样工作
if(_dbContext.Database.CompatibleWithModel())