1
我在與實體框架的問題

在那裏我有類似以下樣機的東西:實體框架4.1代碼首先,聯合主鍵作爲外鍵

public class ClassA 
{ 
    public int ClassAID { get; set; } 
} 

public class ClassB 
{ 
    public int ClassBID { get; set; } 
} 

public class ClassC 
{ 
    public int ClassAID { get; set; } //Foreign Keys combined as Primary Key 
    public int ClassBID { get; set; } 

    public virtual ClassA SomeA { get; set; } 
    public virtual ClassB SomeB { get; set; } 
    public virtual ClassD SomeD { get; set; } 
} 

public class ClassD 
{ 
    public int ClassAID { get; set; } //Primary Key and also references Class C Primary Key 
    public int ClassBID { get; set; } 

    public virtual ClassC SomeC { get; set; } 
} 

D類是在那裏我有一個問題,我希望表示ClassC上主鍵的屬性成爲ClassD上的主鍵,但也是外鍵引用。 (假設上面的屬性名稱與表列名稱相同)

在底層數據庫中,ClassC和ClassD的對應表具有一對一關係,其中ClassA到ClassC和ClassB到ClassC是一對多的關係。

當涉及到實體框架,但它似乎無法處理同一個名稱同時充當主鍵和外鍵的多個屬性,在它生成的底層SQL中,我可以看到它尋找列ClassD_ClassAID,ClassD_ClassBID - 有沒有一種方法使用模型配置來指定正確的映射?

我曾嘗試:

this.HasKey(c => new { c.ClassAID, c.ClassBID }); 
this.HasRequired(c => c.ClassC) 
.WithRequiredDependent(); 

我也試過:

this.HasKey(c => new { c.ClassAID, c.ClassBID }); 
this.HasRequired(c => c.ClassC) 
.WithRequiredDependent() 
.Map(m => m.MapKey("ClassAID", "ClassBID")); 

到目前爲止任何試圖引進一個映射會見

「屬性名XXX已存在於元數據中「。

回答

4

我不知道,如果以下解決您的問題,因爲我不明白的地方,你提到的異常可能來自:

modelBuilder.Entity<ClassC>() 
    .HasKey(c => new { c.ClassAId, c.ClassBId }); 

modelBuilder.Entity<ClassD>() 
    .HasKey(d => new { d.ClassAId, d.ClassBId }) 
    .HasRequired(d => d.SomeC) 
    .WithRequiredDependent(c => c.SomeD); 

這裏最重要的部分是你指定的導航屬性關係的另一方在WithRequiredDependent。如果使用無參數過載EF將創建ClassCClassDSomeD之間的第二個關係屬於此關係而不屬於您正在配置的關係。

我你不指定任何進一步的映射ClassAClassB EF將基於上面和約定的映射創建以下三個關係:

  • ClassA的 - > ClassC(FK = ClassAId在ClassC)
  • ClassB的 - > ClassC(FK = ClassBId在ClassC)
  • ClassC - > D類(FK = ClassAId,ClassBId在D類)

所以, ClassD有一個複合主鍵,它是一個複合外鍵到ClassC在同一時間。

+0

看來我所缺少的是明確指定這個映射:using'.WithRequiredDependent(c => c.SomeD);'謝謝! – Mark 2011-10-18 07:39:50

相關問題