为什么调用modelBuilder.Entity <myentity>()添加配置?

时间:2015-06-17 19:03:14

标签: c# entity-framework ef-code-first

我希望动态地将域类型添加到上下文中。覆盖OnModelCreating,添加类型和配置添加的类型是我假设的非常自然的方式:

public MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<MyEntity>();
        modelBuilder.Configurations.Add(new MyEntityConfig())(); // throws exception            
    }
}

class MyEntityConfig : EntityTypeConfiguration<MyEntity>
{
}

但令人惊讶的是,modelBuilder.Configurations.Add(new MyEntityConfig())()引发了以下异常:

  

EntityFramework.dll中发生了'System.InvalidOperationException'类型的异常,但未在用户代码中处理。

     

其他信息:已添加“MyEntity”类型的配置。要引用现有配置,请使用Entity()或ComplexType()方法。

检查modelbuilder.Configurations显示调用.Set<T>会导致自动添加配置。

任何解决方案?

3 个答案:

答案 0 :(得分:2)

您的帖子 错误(在您修改帖子之前)。您必须引用DbContext.Set<T>,而不是DbModelBuilder.Set<T>

如果情况确实如此,那么你不应该从DbContext.Set<T>内拨打OnModelCreating,它就没有意义。

您可以使用DbContext.Set<T>来获取对数据库集的引用。但是为了获得该数据集,EF首先必须确保所有配置都已初始化,如果它还没有这样做的话。因此,第一次调用DbContext.Set<T>实际上会间接 触发 调用OnModelCreating

当您从DbContext.Set<T>方法中调用OnModelCreating时,我甚至无法想象实际发生了什么。也许它只是动态创建一些默认配置,因为它永远没有机会在线路被调用时完成初始化配置,我无法确定。

答案 1 :(得分:1)

感谢sstan和DavidL正确执行命令的顺序是:

base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new MyEntityConfig())(); 
modelBuilder.Entity<MyEntity>();

答案 2 :(得分:0)

确保您在映射类中引用了正确的类

 public class MyEntityMap: InsightEntityTypeConfiguration<MyEntity>

我意识到在创建新类之前,我只是通过复制现有类,而不是对其进行适当分析来完成此操作。