模型和表更改错误 EF 4.1

Posted

技术标签:

【中文标题】模型和表更改错误 EF 4.1【英文标题】:model and table change error EF 4.1 【发布时间】:2011-04-23 05:36:36 【问题描述】:

我的 MVC3 应用程序中有以下模型,我首先使用实体​​框架 4.1 代码。

public class Movie

    public int Id  get; set; 

    [Required]
    public string Title  get; set; 

    [Required]
    public string Director  get; set; 

    [CustomValidation(typeof(MovieValidator), "ValidateReleaseDate")]
    public DateTime ReleaseDate  get; set; 

不,如果我从 Title 和 Director 中删除 Required 属性并使它们在数据库中可以为空(这是由 EF 代码首先从上述模型自动创建的),我会收到以下错误:

支持“MoviesDB”的模型 自数据库以来上下文已更改 被创建。要么手动 删除/更新数据库,或调用 Database.SetInitializer 与 IDatabaseInitializer 实例。为了 例如, DropCreateDatabaseIfModelChanges 策略将自动删除并 重新创建数据库,并且可以选择 用新数据播种它。

我已阅读,要解决此问题,我必须执行以下操作之一:

1) 删除 db 以便 EF 可以重新创建它

2)在上下文类中添加以下行:(这在 EF 4.1 的上下文中不起作用,我在 application_start 中添加并且它有效。为什么它现在在上下文类中不起作用?)

Database.SetInitializer<MoviesDB>(
    new DropCreateDatabaseIfModelChanges<MoviesDB>());

3) 将表格与模型匹配(我的模型与表格完全相同,为什么我仍然会出现此错误?)

请对第 2 点和第 3 点中提到的问题提出答案。

谢谢。

【问题讨论】:

你把初始化器放在上下文类的什么地方? 【参考方案1】:

设置初始化程序应该在上下文的构造函数中工作,但不需要在每次初始化上下文时调用 - 您只需执行一次,因此在应用程序启动期间调用它是一个好方法。

如果您使用自动更改检测(默认行为),则无法手动更新数据库。当上下文创建一个模型时,它会根据该模型计算一个哈希值,并将其与存储在EdmMetadata 表中的值进行比较(表是在 EF 首次创建数据库时创建的)。如果从数据库加载的值不同,EF 要么启动数据库重新创建(如果配置了初始化程序),要么抛出您看到的异常。手动更改数据库不会修改存储在EdmMetadata 中的哈希,因此模型仍会认为数据库未更改。

这个行为可以通过移除IncludeMetadataConvention来移除:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    model.Conventions.Remove<IncludeMetadataConvention>();

删除此约定后,EF 将不会使用EdmMetadata 表,也不会检查模型中的更改。更新数据库完全取决于您。

【讨论】:

以上是关于模型和表更改错误 EF 4.1的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF 4.1 部署数据库更改

EF - 代码优先 - SQL 默认值 getdate() 给出错误

EF 4.1 模型中的图像数据类型优先

更改 EF 4.1 Code First 默认数据库位置

在 EF 4.1 中拆分 Db 模型

EF-实体更新