我有一个自定义初始化程序设置如下:
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个实体......
如何获取有关EF内部出错的更多信息?我需要知道哪个导航属性有问题...我认为问题是EF正在创建后台工作线程以创建&amp;验证模型,但我不明白为什么异常是如此模糊?
有什么想法吗?
由于 格雷格
答案 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包装以避免这个问题,这样他们就可以向最终用户抛出更有意义的错误......
由于 格雷格