2012-10-12 29 views
0

我有兩個實體;我們稱他們爲人員和地址。一個人只有一個當前地址[插入笑話關於這裏的政治候選人],但也有以前的地址,這些地址也存儲在地址表中。因此,我希望我的數據庫表具有1:多關係。我怎樣纔能有1:多表,但是1:1導航屬性?

然而,在我的實體類,我不希望有一個1:Person和Address之間一對多的關係,因爲我在他們的當前地址只有真正感興趣。 (如果我想知道他們以前的地址,那麼我可以直接看地址表)。所以,我做而不是想在Person對象上1:many「Addresses」屬性。相反,我想要1:1地址屬性,我將設置爲當前地址。

可以這樣做嗎?

+0

豈不是最自然不過的事情是以前的地址存儲在一個單獨的表,例如AddressHistory?他們在同一張桌子上真的很重要嗎? –

+0

這是一個複雜的表格,我不希望重複結構(和伴隨邏輯)。我不相信我的桌子設計應該由工具來驅動,所以我寧願像我直接創建桌子一樣構造桌子。 (我希望我先用DB)。 –

回答

0

不,不能完成。導航屬性表示外鍵關係,並且數據庫中的FK關係代表許多地址爲一個人。例如,當前地址是數據庫中特定查詢的結果,具體取決於「當前」定義的方式 - 對給定人員的所有地址的「select top(1)... order by addresscreationdate descending」查詢。在我看來

可能的解決方案是:

  • 無論是創建一個外鍵CurrentAddressId的人表指的當前地址的第二關係。然後,您可以在您的Person課程中獲得導航參考CurrentAddress
  • 或者執行查詢以使用GetCurrentAddress(Person person)方法或類似方法在存儲庫或服務類中加載當前地址。但是,您現在無法獲得Person課程當前地址的導航屬性。
+0

謝謝。我已經走了你的第一個解決方案。所以我有地址和CurrentAddress關係。 –

2

由於EF關係嚴格遵循DB關係,因此無法通過映射來完成此操作。此外,EF中的一對一關係基於將外鍵放在依賴表中的主鍵上(地址和人員需要具有完全相同的主鍵值),並且此要求不會與期望中的舊地址一起工作表格也是如此。

我想嘗試這種方法(未測試):

public class MyContext : DbContext { 

    public MyContext() { 
     ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
      (sender, e) => { 
       var person = e.Person as Person; 
       if (person != null) { 
        // Fill the property manually 
        person.Address = this.Addresses.FirstOrDefault(/* some condition */); 
       } 
    } 

    protected override void OnModelCreating(DbModelBuilder builder) { 
     // Do not map the propery 
     builder.Entity<Person>().Ignore(p => p.Address); 

     // other mapping 
    } 

    public override int SaveChanges() { 

     // TODO: here you must have your own change tracking logic 
     // for address to know when the address has changed and 
     // new record must be created in the database for old address 

     return base.SaveChanges(); 
    } 

    // rest of context class 
} 
+0

謝謝+1。您的解決方案非常令人印象深刻,但對我來說太「可怕」了。我必須承認,我有一個1:多的財產*和*一個1:1的財產,正如Slauma所建議的。 –

+0

@GaryMcGill:即使你不使用它,它「太可怕」,這是你的問題的正確答案「可以做到,怎麼做?」你應該接受拉迪斯拉夫的答案,而不是我的答案。 – Slauma

+0

@Slauma:OP的正確答案並不一定是解決問題的答案。我的答案主要是解決缺少功能的問題,它帶來了一些缺點,如手動更改地址跟蹤以及N + 1查詢問題,如果您嘗試加載N個人。 –

相關問題