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