2011-12-09 113 views
2

我開始將一些代碼移到EF4.1,並且在加載子類時出現問題。在EF 4.1中映射子類是否需要ID屬性?

我發現this article它看起來像有一種方法來映射子類,但我想知道是否需要父類中的ID列。

我認爲這是「沒有代碼」,只是簡單地引用了孩子課,其餘的照顧。

下面是當前對象模型:

public class classMember 
{ 
    public int MemberID {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

public class classReservation 
{ 
    public int ReservationID {get; set;} 
    public classMember Member {get; set;} 
} 

但加載classReservation只是給空成員。

我是否需要在classReservation以及classMember中包含MemberID的屬性?從設計的角度來看,這似乎是多餘的。

回答

1

首先,爲了讓導航屬性從一個實體到另一個實體,它們必須在POCO中聲明爲虛擬。所以你會想這樣:

public class classReservation 
{ 
    public int ReservationID {get; set;} 
    public virtual classMember Member {get; set;} 
} 

這是因爲在運行時,EF實際上使用反射子類化您的POCO。要使導航屬性起作用,它需要能夠覆蓋它。這就是爲什麼它必須是virtual

要回答你的第二個問題,不,你不需要從子實體到父實體有一個「外鍵屬性」。它有助於EF,但沒有必要。

我們正在從我們的實體模型中刪除外鍵屬性。要做到這一點,你仍然需要告訴EF如何映射數據庫中的關係。你可以在你的DbContext類完成OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<classReservation> 
     .HasRequired(r => r.classMember) 
     .WithMany() 
     .Map(x => x.MapKey("MemberId")); 
} 

你也可以使用HasOptional,WithRequiredDependent,等等,這取決於關係的基數和多樣性。

+0

謝謝。這適用於我的POC測試代碼,但不適用於我正在遷移的代碼庫。必須有一些其他問題,以防止加載。 –

+0

這顯然是一個不同的問題。我已經創建[這篇文章](http://stackoverflow.com/questions/8466929/why-do-some-subobjects-load-and-others-dont)找出爲什麼我的對象層次結構沒有完全加載。但是,感謝幫助我發現我甚至沒有提出正確的問題。 –

相關問題