实体框架tpc继承模型创建

本文关键字:模型 创建 继承 tpc 框架 实体 | 更新日期: 2023-09-27 18:27:32

我正在使用实体框架6和TPC继承策略

每个实体的基类如下:

public class MainObj : IdentifiedModel
{
    public int Status
    {
        get;
        set;
    }
    public string OType
    {
        get;
        set;
    }
    public DateTime Date { get; set; }
}

这是我的模型创建代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<User>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("User");
        });
        modelBuilder.Entity<Entity2>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Entity2");
        });
        modelBuilder.Entity<Entity3>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Entity3");
        });
        modelBuilder.Entity<Entity4>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Entity4");
        });
        base.OnModelCreating(modelBuilder);
} 

正如你所看到的,我正在用它的名字映射每个实体,我有200个实体。有什么更简单的方法吗?

实体框架tpc继承模型创建

是的,有.

选项1

如果您不需要MainObj类成为一个表,那么只需使其抽象并删除一个将表名复数化的约定,如

public abstract class MainObj
{
    public int Status { get; set; }
    public string OType { get; set; }
    public DateTime Date { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    //base.OnModelCreating(modelBuilder); you dont need this line, it does nothing
}

选项2

如果MainObj必须是一个表,那么您可以使用反射为您做映射,并删除一个将表名复数化的约定,如以下所示:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        var methodInfo = GetType().GetMethod("MapInheritedProperties");
        var type = typeof(MainObj);
        foreach (var descendantType in type.Assembly.GetTypes().Where(t => t.IsAssignableFrom(type)))
        {
            var mapInheritedProperties = methodInfo.MakeGenericMethod(descendantType);
            mapInheritedProperties.Invoke(null, new object[] { modelBuilder });
        }
        //base.OnModelCreating(modelBuilder); you dont need this line, it does nothing
    }
    private static void MapInheritedProperties<T>(DbModelBuilder modelBuilder) where T : class
    {
        modelBuilder.Entity<T>().Map(m => { m.MapInheritedProperties(); });
    }
}

我创建了一个MapInheritedProperties方法,它是泛型的,它告诉EF到MapInherited Properties的表是泛型类型。

在使用反射之后,我们从当前类中获得这个方法,然后我们查找从MainObj继承的所有类型,对于每一个我们称为MapInheritedProperties的类型,然后魔法就完成了。