[英]On the “owned” types in EF Core
在我的項目中,我使用 EF Core fluent 配置,代碼優先。 我讀了一些關於擁有類型的信息,但下面的情況對我來說並不是很清楚:
假設我有一個Project
實體和一個ProjectType
。
我應該將 map 該屬性設為:
Entity<Project>.HasOne<ProjectType>();
或者更確切地說Entity<Project>.OwnsOne<ProjectType>();
ProjectType
實體應映射到表ProjectType(ProjectTypeId, Name, Description)
正如我所讀,擁有的是
“只能出現在其他實體類型的導航屬性上的類型。這些被稱為自有實體類型。包含自有實體類型的實體是它的所有者。自有實體本質上是所有者的一部分,沒有它就無法存在”
就我而言
“ ProjectType
只能出現在Project
實體類型的導航屬性上ProjectType
本質上是Project
的一部分,沒有它就不能存在”......但是,據我所知,為了創建一個單獨的表,我需要使用HasOne
,不是OwnsOne
...如果有人更好地解釋這個想法,那就太好了。 非常感謝。
ProjectTypes 聽起來像一個參考表,在應用程序的生命周期內可能會被修改,例如通過系統管理角色。 使用新的“Owns”是一種約定,以幫助強制執行諸如特定類型組合之類的概念,以及在關系數據 model 中鏈接表。
一個更好的組合示例:假設您有一個項目,並且作為項目的一部分,有一些相當大且不經常使用的細節。 諸如圖像或其他二進制數據之類的東西,或者可能是一些大文本。 當您獲取一個或多個項目時,將這些 BLOB/CLOB 詳細信息包含在 Project 表中可能會導致災難,因此您將它們規范化為一個名為 ProjectDetails 的單獨相關表,或者可能是幾個相關表。 這樣,在大多數情況下,當您使用Project
並加載這些實體時,您不必一直擔心拉回這些大字段,您可以引用 ProjectDetails 以僅在實際需要時包含它。 由於 ProjectDetails 本身並沒有真正起到任何作用,它不需要 DbSet 或類似的東西,因此我們可以設置從 Project 到OwnsOne
ProjectDetails 的關系。
另一方面,ProjectType 可能有一個 DbSet 來在配置應用程序的過程中建立新的項目類型。 您可能還希望根據項目類型關聯其他與項目相關的詳細信息。 在這種情況下,將 Project 轉換為HasOne
ProjectType 會更有意義。 我們可以有一個項目類型的 DbSet 來管理,其他實體也可以按項目類型、項目階段/階段等進行過濾。
就數據庫架構而言,在Owns
和Has
之間沒有區別。 它只是關於 EF DbContext 將如何與實體一起工作。
使用Owns
的其他常見示例是鏈接表。 例如,您有一個在訂單、客戶等之間共享的地址表。兩者都不是“擁有”地址,但他們確實擁有自己的鏈接表:訂單擁有 OrderAddress,客戶擁有 CustomerAddress。 這些實體“有”一個地址。 我們可能仍希望查看地址,因為它們代表物理位置,將訂單等關聯到不同位置與“調整”為物理位置記錄的詳細信息之間存在差異。 (即更正街道名稱或市鎮)無需分別處理訂單或客戶的 scope 之外的 OrderAddresses 或 CustomerAddresses。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.