簡體   English   中英

關於 EF Core 中的“擁有”類型

[英]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 來管理,其他實體也可以按項目類型、項目階段/階段等進行過濾。

就數據庫架構而言,在OwnsHas之間沒有區別。 它只是關於 EF DbContext 將如何與實體一起工作。

使用Owns的其他常見示例是鏈接表。 例如,您有一個在訂單、客戶等之間共享的地址表。兩者都不是“擁有”地址,但他們確實擁有自己的鏈接表:訂單擁有 OrderAddress,客戶擁有 CustomerAddress。 這些實體“有”一個地址。 我們可能仍希望查看地址,因為它們代表物理位置,將訂單等關聯到不同位置與“調整”為物理位置記錄的詳細信息之間存在差異。 (即更正街道名稱或市鎮)無需分別處理訂單或客戶的 scope 之外的 OrderAddresses 或 CustomerAddresses。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM