2012-09-12 52 views
0

所以我得到了一個名爲ObjectA的類,它有很多ObjectsB,對象有一個Id,以標識它們,但也是一種語言(枚舉,但它實際上保存爲和INT,並沒有這件事情或者重要)。代碼前2列作爲主鍵/索引

public class ObjectA 
{ 
     public int Id {get;set;} 
     public Language Language {get;set;} 
     ... // and a list of objectA properties 

     public virtual ICollection<ObjectB> ObjectBs {get;set;} 
} 

public class ObjectB 
{ 
     public int Id {get;set;} 
     public Language Language {get;set;} 
     ... // and a list of objectB properties 

     public ObjectA TheObjectA {get;set;} 
} 

現在我學會了如何將它們映射爲主鍵,我爲此使用了流暢的API。我知道你也可以使用[鍵]和[專欄]屬性(我穿上T選用):

modelBuilder.Entity<ObjectA>().HasKey(a => new {a.Id, a.Languague}) 
modelBuilder.Entity<ObjectB>().HasKey(a => new {a.Id, a.Languague}) 

現在,我嘗試了很多東西,但我不能似乎能夠將它們與每個連接其他。任何人都有一個想法,我可以解決這個問題?

+0

可能的重複:http://stackoverflow.com/q/9573043/861716 –

+0

您是否試圖使用帶ID和語言字段的複合主鍵?任何不使用Key和Column屬性的原因?你使用EF5嗎? – trailmax

回答

2

如果一對多關係中的主體(ObjectA)具有複合主鍵,則從屬(ObjectB)必須具有由相同數量的列組成的外鍵。

我假設相關對象A和對象B必須具有相同的語言。在這種情況下,您可以將ObjectB.Language作爲外鍵的第一部分。 (這是在同一時間在ObjectB的主鍵和外鍵的一部分。)如果你在你的模型暴露FK的第二部分財產,它應該是這樣的:

(我相信你必須交換IdLanguage了以下工作)

public class ObjectA 
{ 
    public Languague Languague {get;set;} 
    public int Id {get;set;} 
    ... // and a list of objectA properties 

    public virtual ICollection<ObjectB> ObjectBs {get;set;} 
} 

public class ObjectB 
{ 
    public Languague Languague {get;set;} 
    public int Id {get;set;} 
    ... // and a list of objectB properties 

    public int TheObjectAId {get;set;} 
    public ObjectA TheObjectA {get;set;} 
} 

和Fluent API映射:

modelBuilder.Entity<ObjectA>().HasKey(a => new { a.Languague, a.Id }) 
modelBuilder.Entity<ObjectB>().HasKey(b => new { b.Languague, b.Id }) 

modelBuilder.Entity<ObjectA>() 
    .HasMany(a => a.ObjectBs) 
    .WithRequired(b => b.ObjectA) 
    .HasForeignKey(b => new { b.Language, b.TheObjectAId }); 

如果語言可以引入不同的語言獨立的FK屬性:

public Language TheObjectALanguage {get;set;} 
    public int TheObjectAId {get;set;} 
    public ObjectA TheObjectA {get;set;} 

...與地圖:

modelBuilder.Entity<ObjectA>() 
    .HasMany(a => a.ObjectBs) 
    .WithRequired(b => b.ObjectA) 
    .HasForeignKey(b => new { b.TheObjectALanguage, b.TheObjectAId }); 

如果關係是可選的使用WithOptional代替WithRequired,使FK特性可爲空:

public Language? TheObjectALanguage {get;set;} 
public int? TheObjectAId {get;set;} 

我你不想在您的模型中具有FK屬性,您可以使用MapKey與Fluent API:

modelBuilder.Entity<ObjectA>() 
    .HasMany(a => a.ObjectBs) 
    .WithRequired(b => b.ObjectA) 
    .Map(m => m.MapKey("TheObjectALanguage, TheObjectAId")); // FK columns