什么会导致EF Code First IDatabaseInitializer InitializeDatabase无法被调用?

时间:2011-12-05 18:03:29

标签: entity-framework c#-4.0

我有一个自定义初始化程序设置如下:

public class PromptIfChangesNeededDBInitializer : IDatabaseInitializer<MeyerREContext>
{

    public PromptIfChangesNeededDBInitializer()
    {  // This constructor is called properly

    }

    #region IDatabaseInitializer<TContext> Members


    public void InitializeDatabase(MeyerREContext context)
    { // This is never called

       ... Code that checks existence and seeds etc

    }

 }

这是我的DbContext类

public class MeyerREContext : DbContext
{
    static MeyerREContext()
    {
        Database.SetInitializer(new PromptIfChangesNeededDBInitializer());
    }

    public DbSet<Address> Addresses { get; set; }
    ... More DbSet property definitions


protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

       modelBuilder.Configurations.Add(new AddressMap());
      ... More Configurations 

    }

}

这是对上下文的第一次调用

City city = dbNew.Cities.Where(e=>e.CityName=="Foley").FirstOrDefault();

初始化程序的构造函数在断点确认后正确调用,OnModelCreating在断点确认后正常运行,但在OnModelCreating完成后,从不调用InitializeDatabase ...

我从DBContext的ctor中删除了Database.SetInitializer(new PromptIfChangesNeededDBInitializer())调用到调用类的ctor之前调用上下文并且我现在得到了稍微不同的行为:

public class CreateData
{

    private VFPModelContainer db = new VFPModelContainer();
    private MeyerREContext dbNew;

    public CreateData()
    {
        Database.SetInitializer(new PromptIfChangesNeededDBInitializer<MeyerREContext>());

        dbNew = new MeyerREContext();
        dbNew.Database.Initialize(force: true);   NUll Exception here now...

    }

现在,在EF Framework代码中生成了一个null异常:

以下是例外情况:

System.NullReferenceException occurred
Message=Object reference not set to an instance of an object.
Source=EntityFramework
StackTrace:
   at    
    System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.ValidateConsistency(NavigationPropertyConfiguration navigationPropertyConfiguration)

InnerException:

看起来在EntityTypeConfiguration调用之一中发生异常,但异常被某种方式吞噬了?我该怎么知道它是哪个电话?这个模型中有大约100个实体......

How can I get more info than is shown in the Intellitrace ?

如何获取有关EF内部出错的更多信息?我需要知道哪个导航属性有问题...我认为问题是EF正在创建后台工作线程以创建&amp;验证模型,但我不明白为什么异常是如此模糊?

有什么想法吗?

由于 格雷格

1 个答案:

答案 0 :(得分:4)

必须安装Reflector并反编译EF Assembly以找出问题所在:

这是导致问题的线......

private void ValidateConsistency(NavigationPropertyConfiguration navigationPropertyConfiguration)
{
  if ((navigationPropertyConfiguration.InverseEndKind.HasValue && this.EndKind.HasValue) && (navigationPropertyConfiguration.InverseEndKind != this.EndKind))
  {
    throw System.Data.Entity.ModelConfiguration.Resources.Error.ConflictingMultiplicities(this.NavigationProperty.Name, this.NavigationProperty.ReflectedType);
  }
  if ((navigationPropertyConfiguration.EndKind.HasValue && this.InverseEndKind.HasValue) && (navigationPropertyConfiguration.EndKind != this.InverseEndKind))
  {
    throw System.Data.Entity.ModelConfiguration.Resources.Error.ConflictingMultiplicities(this.InverseNavigationProperty.Name, this.InverseNavigationProperty.ReflectedType);
  }

在我的情况下,InverseNavigationProperty属性为null,导致和异常WHEN EF试图抛出异常......

根本问题是我定义了一个反向属性关系,但没有为它定义映射......

但是,不可能确定哪个实体导致了这个问题......这个方法中的这些检查应该用try catch包装以避免这个问题,这样他们就可以向最终用户抛出更有意义的错误......

由于 格雷格