【问题标题】:EF MappingApi returns column name for parent classEF MappingApi 返回父类的列名
【发布时间】:2016-04-19 13:54:36
【问题描述】:

我正在构建一个必须插入大量数据的通用方法。所以我使用 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"

关于如何抛出这个并为类获取正确的表名有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    如果可以使用attribute代替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);
            }
    

    【讨论】:

      猜你喜欢
      • 2019-09-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2020-05-12
      • 1970-01-01
      相关资源
      最近更新 更多