EF MappingApi返回父类的列名

时间:2016-04-19 13:54:37

标签: c# entity-framework ef-code-first table-per-type

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

我试图获得这样的表名:

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

它适用于基类,但不适用于派生类。

架构:

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首先针对B类每个操作发送两个请求,然后针对A类发送请求。但是,ctx.Db(typeof(B)).TableName == "A"

关于如何抛出这个并为类获得正确的表名的任何想法?

1 个答案:

答案 0 :(得分:0)

如果您可以使用属性而不是ToTable(&#34; B&#34;),这是一个简单的解决方案

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);
        }
相关问题