我希望动态地将域类型添加到上下文中。覆盖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>
会导致自动添加配置。
任何解决方案?
答案 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>
我意识到在创建新类之前,我只是通过复制现有类,而不是对其进行适当分析来完成此操作。