1

遵循TPC模式。 我有一個名爲Entity的抽象類,由Person和LegalEntity繼承。外鍵屬性可以是組合主鍵的一部分嗎?

public abstract class Entity 
    { 
    public int Id { get; set; } 
    } 

public class LegalEntity : Entity 
    { 
    public string CorporateName { get; set;} 
    } 

public class Person : Entity 
    { 
     public string Name { get; set; } 
    } 

我也有另一個叫做代理有很多孩子。爲了簡化,我將只顯示一個類的訂閱者。

public abstract class Agent 
    { 
    public int EntityId { get; set; } 

    public int RoleId { get; set; } 
    } 

public class Subscriber : Agent 
    { 
    public string Number { get; set; } 

    public Entity Entity { get; set; } // No EntityId here because the foreign key correspond to the Id of Subscriber 
    } 

下面我實體的配置:

public AgentConfiguration() 
    { 
     HasKey(s => new { s.EntityId, s.RoleId }); 
     ... 
    } 

public SubsbcriberConfiguration() 
    { 
     Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("T_ACTEUR_SOUSCRIPTEUR"); 
      } 

      **.WithMany() //I don't want a property on the other side 
      .HasForeignKey(s => s.EntityId); // EF doesn't accept to put the property Id as a foreign key.** 

    } 

    public EntityConfiguration() 
    { 
     HasKey(e => e.Id); 
     Property(e => e.Id).HasColumnName("id_personne"); 
     ... 
    } 

    public PersonConfiguration() 
    { 
     Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("T_PERSONNE_PHYSIQUE"); 
     }); 
    } 

我有抽象實體類和具體類用戶之間的一對一的關係。 類實體的主鍵同時是訂閱者的組合主鍵和外鍵的一部分。

是否可以配置此場景?

當我宣佈屬性id作爲外鍵,EF拋出一個異常,如下圖所示:

國外關鍵部件「ENTITYID」不在類型「訂閱」聲明的屬性。驗證它沒有被明確地從模型中排除,並且它是一個有效的基本屬性。

我嘗試了很多方案,但我沒有找到解決方案,因爲我有一對一的關係,但表具有不同的鍵和外鍵是組合主鍵的一部分。

我怎樣才能配置一個屬性作爲外鍵,也是代碼中的複合主鍵的一部分?

我錯過了什麼?任何幫助將不勝感激!

編輯:

我分手了類代理和TPC的繼承。現在類Subscriber沒有父類。當我將其配置如下圖所示:

public SubsbcriberConfiguration() 
    { 
     HasKey(s => new { s.EntityId, s.RoleId }); 
     Property(s => s.EntityId).HasColumnName("id_personne") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     Property(s => s.RoleId).HasColumnName("id_role") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     ... 
     ToTable("T_ACTEUR_SOUSCRIPTEUR"); 

     HasRequired(s => s.Entity) 
     .WithMany() 
     .HasForeignKey(s => s.EntityId) 
     .WillCascadeOnDelete(false); 
    } 

實體框架正在尋找其它外鍵:列Extent1.Entity_Id不存在

而由EF生成的查詢當我嘗試加載訂戶是:

`SELECT 
    "Extent1"."id_personne", 
    "Extent1"."id_role", 
    ... 
    "Extent1"."Entity_Id" 
FROM "T_ACTEUR_SOUSCRIPTEUR" AS "Extent1" 
WHERE "Extent1"."id_personne" = ((73660)) AND 
    "Extent1"."id_role" = ((4))` 

我不知道如何向E​​F解釋外鍵屬性EntityId是外鍵。

有人可以對此有所瞭解嗎?

謝謝。

+0

實體和訂戶關係是「一對一」還是「一對多」? –

+0

'WithMany()'用於1:n關係 –

+0

@FabioLuz在實體框架中,當您與實體之間的不同鍵具有一對一關係時,您必須遵循此黑客攻擊,它也被稱爲「一對一外國關鍵協會「。看到這個[link](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations)。如果我有相同的密鑰,我會使用hasRequiRed()。WithOptional()技術... –

回答

1

嗯,我不確定我是否瞭解你的情況,但這可能會有所幫助。

實體:

public class Entity 
{ 
    public int EntityId { get; set; } 
} 

public abstract class Agent 
{ 
    public int EntityId { get; set; } 

    public int RoleId { get; set; } 
} 

public class Subscriber : Agent 
{ 
    public string Number { get; set; } 

    public Entity Entity { get; set; } 
} 

映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Entity>() 
     .HasKey(e => e.EntityId); 

    //map the Subscriber, not the Agent 
    modelBuilder.Entity<Subscriber>() 
     .HasKey(a => new { a.EntityId, a.RoleId }); 

    modelBuilder.Entity<Subscriber>() 
     .HasRequired(i => i.Entity) 
     .WithMany() 
     .HasForeignKey(i => i.EntityId) 
     .WillCascadeOnDelete(false);   

    base.OnModelCreating(modelBuilder); 
} 

要知道,這是一個「1對多」關係,而不是一對1。您在評論中發佈的文章使用UNIQUE CONSTRAINTS以1:1關係「模擬」1:1關係。我不認爲這是一個好方法。

但是,讓我們假設你想按照這種方式。你會在哪裏放置唯一約束? FK是複合PK的一部分。如果你在那裏放置一個唯一約束,它會破壞PK。考慮到PK由兩列組成,並且FK由PK的一列組成,我看不出真正的1:1關係是可能的。由於具有1:1的關係,FK列必須與PK列相同。

希望它有幫助!

+0

實體代理沒有它自己的Id,它具有類實體的ID。 –

+0

這只是該物業的名稱。我編輯了答案。請檢查一下。 –

+0

實體框架沒有明確規定EntityId屬性是實體實體的外鍵,我有以下異常:外鍵組件'EntityId'不是'Subscriber'類型的聲明屬性。驗證它沒有被明確地從模型中排除,並且它是一個有效的基本屬性。 –

相關問題