2015-05-21 53 views
1

我試圖映射我的實體遵循TPC模式。爲什麼MapInheritedProperties()將我的實體映射到兩個表中?

我有一個抽象基類代理:

public abstract class Agent 
    { 
     public int Id { get; set; } 
     public DateTime? ChangeDate { get; set; } 
     public DateTime CreationDate { get; set; } 
     public string insuranceCompanyPolicyNumber { get; set; } 
     public int? KeySys { get; set; } 
     public int RoleId { get; set; } 
     public Role Role { get; set; } 
     public string Status { get; set; } 
     public int? Transactionid { get; set; } 
    } 

我有一個孩子的實體會員鍵:

public partial class Suscriber : Agent 
    { 
     public int? id_federateur { get; set; } 
     public string Number { get; set; } 
     public bool? suivi_client { get; set; } 
     public virtual ICollection<Contract> Contracts { get; set; }  
    } 

當我嘗試配置類似下面的會員鍵,我已經注意到,由實體框架生成的請求是錯誤的:

public class SuscriberConfiguration : EntityTypeConfiguration<Suscriber> 
    { 
     public SuscriberConfiguration() 
     { 
      Map(m => 
       { 
        m.MapInheritedProperties(); 
        m.Property(s => s.Number).HasColumnName("numero_souscripteur"); 
        // Property(s => s.Number).HasColumnName("numero_souscripteur"); 
        m.ToTable("T_ACTEUR_SOUSCRIPTEUR"); 
       }); 
     } 
    } 

Entit生成的請求Ÿ框架是(表Agent2不存在):

SELECT E'0X0X' AS "C1", 
     "Extent1"."id_personne", 
     "Extent1"."suivi_client", 
     "Extent1"."id_federateur", 
     "Extent2"."date_mod", 
     "Extent2"."date_cre", 
     "Extent2"."insuranceCompanyPolicyNumber", 
     "Extent2"."keySys", 
     "Extent2"."id_role", 
     "Extent2"."statut", 
     "Extent2"."vsc_transactionid", 
     "Extent2"."numero_souscripteur"  
FROM "atlas"."Agent2" AS "Extent1" 
INNER JOIN "atlas"."T_ACTEUR_SOUSCRIPTEUR" AS "Extent2" ON 
    "Extent1"."id_personne" = "Extent2"."id_personne" 

我知道,如果我改變了這樣的會員鍵的配置,它會工作

public class SuscriberConfiguration : EntityTypeConfiguration<Suscriber> 
    { 
     public SuscriberConfiguration() 
     { 
      Map(m => 
       { 
        m.MapInheritedProperties(); 
        // m.Property(s => s.Number).HasColumnName("numero_souscripteur"); 
        Property(s => s.Number).HasColumnName("numero_souscripteur"); 
        m.ToTable("T_ACTEUR_SOUSCRIPTEUR"); 
       }); 
     } 
    } 

換句話說,如果我配置屬性Number在方法Map的作用域之外或者我沒有將方法Property應用於lambda參數,它的工作原理。 (Property(s => s.Number).HasColumnName("numero_souscripteur");)

有人可以解釋我如何使用方法MapInheritedProperties()的作品?

爲什麼Entity Framework會生成一個不存在的表?

感謝

回答

0

這是因爲你把一個映射片段一切......

Map(m => { ... }) 

...映射到該片段適用於表。實際上它的意思是:將AgentNumber的所有屬性從Subsriber映射到表「T_ACTEUR_SOUSCRIPTEUR」。 EF默默地認爲剩菜映射到通過命名約定設備的另一個表。只要您從派生類型映射一個屬性,就會發生這種情況。如果僅使用MapInheritedProperties(),則所有屬性(包括導出的屬性)都映射到映射片段中的表。

我不知道這是一個錯誤還是一個功能。至少不是很清楚。無論如何,您應該將映射片段之外的其他屬性名稱映射到您已經發現的地方。當然,這更清楚,如果你這樣做,在一個單獨的語句:

Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("T_ACTEUR_SOUSCRIPTEUR"); 
    }); 
Property(s => s.Number).HasColumnName("numero_souscripteur"); 

或者,如果你喜歡:

Map(m => m.MapInheritedProperties()); 
ToTable("T_ACTEUR_SOUSCRIPTEUR"); 
Property(s => s.Number).HasColumnName("numero_souscripteur"); 
相關問題