2013-05-06 29 views
0

在当前项目中,我使用实体框架6.0 alpha3和代码优先方法。我有一个自定义数据上下文,它在构造函数中使用DbConnection来访问它的数据库。我的迁移既可以在VisualStudio中执行,也可以在运行时使用MigrationToLatestVersion初始值设定项完成。实体框架6.0代码优先迁移 - 模型/数据库兼容性错误?

样品:

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); 
    } 
} 

我检查数据库模型使用以下

if(_dbContext.Database.CompatibleWithModel()) 

......这是,在这种情况下:假的。

如果我现在运行初始化程序,并且我的数据库还没有可用,那么所有东西都会按照它应该创建的方式创建,并且CompatibleWithModel函数返回 - 正如所料:true。

现在,为了测试的目的,我改变了数据库,首先稍微,然后完全。我删除了一列,然后是整个表格,甚至是_MigrationsHistory表格。

但无论我做什么:_dbContext.Database.CompatibleWithModel()始终返回true!当我尝试初始化上下文时,出现奇怪的错误,例如:“The table TabAnswers already exists in database.” - 即使它不再存在。

但是,当我尝试更新,以恢复我的数据库:“There are currently no pending updates...

这是一个错误?

+0

您似乎缺少上下文类中的默认无参数构造函数。我没有使用EF6进行实验,但在EF5中,MigrationToLatestVersion会抛出一个异常,表明上下文不可构造。 – 2013-05-06 12:55:44

+0

@WiktorZychla提供了无参数构造函数 - 我只是忘记将其包含在问题中。但是你是对的,这个不会那样工作。 ;) – Atrotygma 2013-05-06 13:20:40

回答

4

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

实体框架确定模型是否与数据库兼容的唯一方式是通过比较您的上下文存储的哈希和存储在__MigrationsHistory表中的哈希。这就是为什么删除一个列或表不会使Database.CompatibleWithModel返回false - 哈希仍然是相同的。

现在,当您删除__MigrationsHistory时,您正在使Entity Framework认为您正在使用Code First to an Existing Database的方法。从此时起,Entity Framework将假定您负责保持数据库和模型的同步。在这种情况下,Database.CompatibleWithModel方法的行为取决于参数throwIfNoMetadata的值。如果throwIfNoMetadata设置为true,那么如果在与上下文关联的模型或数据库本身中找不到模型元数据,则会抛出异常。如果设置为false,那么如果未找到元数据,则该方法将返回true。

+0

很好的概述(y) – NSGaga 2013-05-06 13:01:10

相关问题