物體框架的代碼如何首先定義一個這樣的表結構 結構
class A
{
PK
名稱1
List<ClassC>
}
class B
{
PK
名稱2
List<ClassC>
}
class C
{
PK
A類
類B
}
uj5u.com熱心網友回復:
你在圖表中勾勒的關系可能不會做你認為的那樣。
如果TableC上的ParentId是要指向表A上的Id或表B上的Id,這將不會起作用。匹配的記錄必須同時出現在表 A 和表 B 中。
SQL Server將允許這樣做,EF(至少是EF6)將支持這樣做,只要ParentId在物體中被宣告并被設定為兩個關系的FK。影子屬性(EF6使用 以下面兩個例子為例。
我們有一個學校的系統,我們有學生(表A)和教師(表B)。學生和教師都有一個或多個地址(表 C) 一個地址可能屬于某個學生(表 B)。
一個地址可能屬于一個學生,也可能屬于一個教師,它很少同時屬于一個學生和一個教師。因此,像你指定的表結構,在ParentID之間有一個指向學生和教師表的FK,就沒有什么意義了。Parent ID 5必須同時存在于Students和Teachers中,而不是一個或另一個,即使它可以,你也不知道一個地址是指學生還是教師。從資料庫的角度來看,你可以添加一個ParentType來指示ParentId是指學生還是教師,但是你必須洗掉ParentId上的FK,因為它不能同時指向兩個表,并期望只找到一個或另一個。這就變成了一種隱含的關系,不是很有效,而且不能用約束條件來強制執行。(即確保ParentId實際指向任一表的行,或正確的表,等等)它也不能被映射為EF中的關系。
這種作業方式是將學生和教師合并到一個人表中,并使用類似于角色識別符號的東西來判斷一個人是學生還是教師。通過這種方式,地址表可以合法地擁有一個PersonId。(而不是ParentId)在EF中,你仍然可以通過Person基類將Student和Teacher兩個類映射到Person表中,使用Role作為鑒別器。在EF中,這被稱為Table-per-Hierarcy繼承。 當與一個共同的物體(如地址)共享關系的類是合理的關系時,這種方法是有效的。我們可以在一個基類表和相關的多面表之間建立一對多的關系。如果你想讓一個學生、教師和學校有一個或多個地址,那就不那么好辦了。(學校不是一個 "人",也不應該被當作一個人。即使是可關聯的物體,這也是有問題的,我們希望有幾個欄位是針對學生的,而其他欄位是針對教師的。這就需要在Person表中添加一堆可忽略的欄位,或者從Person到StudentInfo或TeacherInfo表的0-1關系來保存學生或教師的具體細節。
如果我們有不相關的物體,并且需要在諸如學生表、教師表和學校表之間建立一對多的關系,這些表都與一個或多個地址記錄有關,那么更好的選擇是采用多對多的關系。
Student StudentAddress (StudentId, AddressId) 教師Map(x => x.MapKey()))不起作用,因為它想為兩個關系使用相同的名字,至少在EF6是這樣。在EF Core中,你需要測驗這是否被支持。
學校
SchoolAddress (SchoolId, AddressId)
地址
在這種情況下,如果多對多表僅由FKs作為復合PK而沒有其他列組成,并且你使用EF6或EF Core 5,那么學生、教師或學校可以有一個地址物體的集合。(我相信支持這個)早期版本的EF Core不支持通過未映射的連接表自動參考,所以這需要通過映射的連接物體宣告集合。(例如:ICollection<StudentAddress>)
地址可以包含對學生/教師/學校集合的參考,盡管一般來說,除非真的有必要,否則我不會麻煩地映射這些集合。作為一個多對多的關系,這將在法律上允許同一個地址屬于多個學生,而這在適當的一對多中是不允許的。
為了執行適當的一對多,地址表將被移除,而地址欄位將被放入每個學生地址、教師地址和學校地址表中。
uj5u.com熱心網友回復:
你目前的類結構與圖片上的ERD不一致。
構成圖片的關系:
C可以與許多A相連,但A只能與一個C相連(1:M)
。
C可以與許多B相連,但B只能與一個C相連(1:M)
。
下面的結構應該是可行的:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
//完全定義的關系。
public int C_Id { get; set; }
public C C_ojb { get; set; }
}
public class B
{
public int Id { get; set; }
public string Name { get; set; }
//完全定義的關系。
public int C_Id { get; set; }
public C C_obj { get; set; }
}
public class C ; }
{
public int Id { get; set; }
public string Name { get; set; }
//完全定義的關系。
public List<A> As { get; set; }
public List<B> Bs { get; set; }
我推薦你訪問這個頁面:
https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api,fluent-api-simple-key,simple-key
https://www.learnentityframeworkcore.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309870.html
標籤:
上一篇:當試圖添加帶有身份列的新條目時,EF6拋出并發性例外
下一篇:資料庫的外鍵約束保存
