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
。我在服务类中动态地设置它,如follow
context.Set()
。因此,您的解决方案引发异常,无法为“MyClass”创建DbSet,因为上下文的模型中不包含此类型。然后您必须添加实体类型,但这是另一个问题。我可以在此foreach循环中设置实体类型吗?不,这是在EF根据DbSet属性配置的实体类型上循环。如果要添加实体类型,可以调用
modelBuilder.Model.AddEntityType(typeof(MyEntityType))第一个。