2011-04-23 73 views
1

我在MVC3应用下面的模型,我首先使用实体​​框架4.1的代码。模型和表更改错误EF 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; } 
} 

野老,如果我从标题和导演除去必需的特性,使他们可为空数据库(这是由EF代码首先从上面的模型自动创建的),我得到以下错误:

The model backing the 'MoviesDB' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

我已阅读,来解决这个我必须做下面的事情之一:

1)删除数据库,使EF可以重新创建它

2)添加如下:●在上下文类中:(这不适用于EF 4.1的上下文中,我在application_start中添加了它并且工作正常。为什么犯规它在上下文中CALSS现在的工作?)

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

3)匹配表模型(我的模型是表为什么我仍然得到这个错误完全一样?)

请建议的提及问题的答案第2点和3

感谢。

+0

你在哪里放置在上下文类的初始化? – 2011-04-23 10:05:31

回答

3

设置初始化应该例如工作在上下文中的构造函数,但它不需要调用每次初始化背景时 - 你需要做它只有一次,以便在应用程序启动时调用它是一个不错的办法。如果您正在使用自动变化检测(默认行为)

Manully更新数据库,不能正常工作。当上下文创建模型从这个模型,计算散列,并将其与存储在EdmMetadata表(表创建第一次EF创建数据库)值相比较。如果从数据库加载的值不同,EF会启动数据库重新创建(如果初始化程序已配置)或引发您看到的异常。手动更改数据库将不会修改存储在EdmMetadata中的哈希值,因此模型仍会认为数据库未更改。

这种行为可以通过删除IncludeMetadataConvention被删除:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    model.Conventions.Remove<IncludeMetadataConvention>(); 
} 

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