2016-04-19 13 views
1

Ich erstelle eine generische Methode, die viele Daten einfügen muss. Also verwende ich SqlBulkCopy zum Einfügen, Reflektion, um Werte von Objekten zu erhalten und MappingApi, um DB-Schema zu bekommen. Ich muss verschachtelte Objekte nicht einfügen, um es so einfach wie möglich zu halten.EF MappingApi gibt den Spaltennamen für die Elternklasse zurück

Ich versuche Tabellennamen wie folgt zu erhalten:

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

Es ist für Basisklassen arbeiten, aber nicht für abgeleitete Klassen.

Schema:

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-Operationen auf diesem Schema arbeiten. EF sendet zwei Anfragen pro Operation zuerst für Klasse B und dann für Klasse A. Aber ctx.Db(typeof(B)).TableName == "A"

Irgendwelche Ideen, wie man dies werfen und richtigen Tabellennamen für die Klasse bekommen?

Antwort

0

Wenn Sie verwenden können, stattdessen Totable Attribut ("B"), hier ist eine einfache Lösung

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); 
     }