遵循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))`
我不知道如何向EF解釋外鍵屬性EntityId是外鍵。
有人可以對此有所瞭解嗎?
謝謝。
實體和訂戶關係是「一對一」還是「一對多」? –
'WithMany()'用於1:n關係 –
@FabioLuz在實體框架中,當您與實體之間的不同鍵具有一對一關係時,您必須遵循此黑客攻擊,它也被稱爲「一對一外國關鍵協會「。看到這個[link](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations)。如果我有相同的密鑰,我會使用hasRequiRed()。WithOptional()技術... –