Entity framework 如何定义通用实体类型并在实体框架modelbuilder中应用?
我有一个表示数据库视图的界面Entity framework 如何定义通用实体类型并在实体框架modelbuilder中应用?,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我有一个表示数据库视图的界面 public interface IView { } 我想使用modelbider设置HasNoKey()方法 public class DataContext : DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<IView>(buildAction
public interface IView { }
我想使用modelbider设置HasNoKey()
方法
public class DataContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IView>(buildAction =>
{
buildAction.HasNoKey();
});
base.OnModelCreating(modelBuilder);
}
}
公共类DataContext:DbContext
{
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
实体(buildAction=>
{
buildAction.HasNoKey();
});
基于模型创建(modelBuilder);
}
}
但这引发了一个例外。我可以使用反射来实现这一点吗?或者在entity framework core中是否有任何解决方案?您可以在OnModelCreating中迭代所有模型类型。像这样:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var t in modelBuilder.Model.GetEntityTypes().Where( t => typeof(IView).IsAssignableFrom(t.ClrType)))
{
t.IsKeyless = true;
}
base.OnModelCreating(modelBuilder);
}
但是我没有在
DbContext
中添加属性作为DbSet
。我在服务类中动态地设置它,如followcontext.Set()
。因此,您的解决方案引发异常,无法为“MyClass”创建DbSet,因为上下文的模型中不包含此类型。然后您必须添加实体类型,但这是另一个问题。我可以在此foreach循环中设置实体类型吗?不,这是在EF根据DbSet属性配置的实体类型上循环。如果要添加实体类型,可以调用modelBuilder.Model.AddEntityType(typeof(MyEntityType))代码>第一个。