模型和表更改错误 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的主要内容,如果未能解决你的问题,请参考以下文章