EF MappingApi returns 父项的列名称 class

EF MappingApi returns column name for parent class

我正在构建一个必须插入大量数据的通用方法。所以我使用 SqlBulkCopy 进行插入,使用反射从对象中获取值,使用 MappingApi 获取数据库模式。为了尽可能简单,我不需要插入嵌套对象。

我正在尝试获取 table 这样的名称:

using (var ctx = GetStorage())
{
    tableName = ctx.Db(typeof(T)).TableName;
}

它适用于基础 classes 但不适用于派生 classes。

架构:

public abstract class A
{
    public int Id { get; set; }
}

public class B: A
{
    public int Site_Id { get; set; }
}

public class AMap : EntityTypeConfiguration<A>
{
    public AMap()
    {
        HasKey(t => t.Id);
        Property(t => t.Id).IsRequired();

        ToTable("A");
        Property(t => t.Id).HasColumnName("Id");
    }
}

public class BMap : EntityTypeConfiguration<B>
{
    public BMap()
    {
        HasKey(t => t.Id);
        Property(t => t.Id).IsRequired();
        Property(t => t.Site_Id).IsRequired();

        ToTable("B");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.Site_Id).HasColumnName("Site_Id");
    }
}

EF CRUD 操作正在处理此模式。 EF 为每个操作发送两个请求,首先是 class B,然后是 class A。但是,ctx.Db(typeof(B)).TableName == "A"

关于如何抛出这个并获得 class 的正确 table 名称的任何想法?

如果可以使用属性代替 ToTable("B"),这里有一个简单的解决方案

public static string GetTableName<T>()
        {
            var attr = Attribute.GetCustomAttributes(typeof (T), typeof (TableAttribute)).OfType<TableAttribute>().FirstOrDefault();

            if (attr != null)
            {
                return attr.Name;
            }

            throw new Exception("Could not load TableAttribute of type" + typeof (T).Name);
        }