2012-09-14 160 views
0

我有一些POCO類一般可以分爲兩類,例如: 是否有可能在兩個DbContext之間共享POCO對象?

public class Student 
{ 
    public Student() 
    { 
     this.Courses = new List<Course>(); 
     this.Clubs = new List<Club>(); 
    } 

    public int Id { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 
    public virtual ICollection<Club> Clubs { get; set; } 
} 

和相應的課程和俱樂部類,它們都有自己的其他類的關係。

的問題是,這兩個羣體都大了,它們都含有大量的類,並且它們中的每一個工作單位,像學生課程管理單位將提供相關的課程什麼功能;俱樂部管理部門將提供功能。所以我不打算把它們放到一個DbContext中。

有跡象表明,需要得到俱樂部的學生則檢索其課程信息的一些要求。我現在正在做的是使用我從俱樂部單位獲得的學生ID在課程單元中做另一個查詢。其工作正常,但我跳,使其更簡單,像

foreach(var student in club.Students){ 
    ClubContext.Detach(student); 
    CourseContext.Attach(student); 
    foreach(var c in student.Courses){ 
     ... 
    } 
} 

,但我得到了一些例外,像這樣:

已經有一個層對象類型 「POCOTest生成的代理類型。 Models.Student」。當同一對象層 類型由AppDomain中的兩個或更多不同模型映射時,會發生這種情況。

這可能嗎?如果是這樣,怎麼樣?謝謝〜

回答

2

您可以在多種環境映射單一類,但映射應該總是相同的。如果不相同,則不能使用動態代理(延遲加載),因爲每個映射都需要處理其導航屬性的自己的代理類型。

在你的情況下,第一上下文映射包含Student實體關係Club,但這種關係並不在第二映射,其中在相反的關係存在與Course存在。這要求兩種不同的代理類型用於相同的實體類型。

異常說,它不支持。有兩個原因,這不能工作:

  • EF存儲在靜態辭典哪裏即使你解決的第一個點(通過下載源代碼和修改他們每個實體類型只能有一個生成的代理
  • 代理類型)你仍然無法做你想做的事,因爲代理類型是實體。它不是一個包裝。所以,當你從第一個環境中分離並附加到第二個環境時,這個類型不能被替換。
+0

真棒,非常感謝〜 – Ariex

1

如果您不需要延遲加載,只是從你的導航屬性中刪除了「虛擬」的關鍵字,也將努力爲你想要的。虛擬用於啓用延遲加載。

+0

的'virtual'關鍵字用來表明該方法可以通過從該繼承的類被覆蓋。 –

相關問題