[英]Understanding disabling on cascade delete using fluent api
我是 asp.net 的新手,我正在學習使用以下代碼添加這段代碼以禁用相關表中的級聯刪除的課程:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Attendance>()
.HasRequired(a => a.Gig)
.WithMany()
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
我想了解很多部分:
為什么我們用出勤類型定義實體方法,根據我的理解,應該在創建方法時使用這種類型來指定返回值,而不是在調用方法時。
HasRequired 是什么意思, HasRequired
是什么意思?
級聯刪除
假設您的出席有另一種類型的鏈接。 因此,在數據庫中,這種其他類型(表)將具有Attendance
表的外鍵。
如果您嘗試刪除數據表中的一條Attendance
記錄,如果該記錄在另一個表中使用,它將失敗。
級聯刪除將刪除除考勤記錄之外的所有相關記錄。
如果不啟用級聯刪除,刪除將失敗,因為其他記錄需要這條考勤記錄。
實體
不管你是從你的代碼生成數據庫還是數據庫已經存在,你的C# class 代表表都不能提供所有信息(例如如果你不遵循約定,EF就無法知道哪個字段是主鍵,哪個字段不可為空(請參閱下一點),或者表名稱是否與 class 名稱匹配)。
使用modelBuilder.Entity<Attendance>()
您將幫助 EF 構建他的“數據庫外觀的內部 model”。 在這種情況下,您向 EF 提供有關“出勤”類型的附加信息。
所以你可以警告 EF 這個表在另一個模式中或者表名不同......
您可能可以為所有實體/表執行此操作。
IsRequired
(在您的示例中未使用,但我對IsRequired
和HasRequired
有信心,所以我在這里解釋)
IsRequired
與可為空的類型一起使用。 在數據庫中,您可以有一個類型“varchar(x) not null”,在 C# 中,它將是一個“字符串”。 但是字符串在 C# 中可以為空,因此HasRequired
是一種配置,它會告訴您的 ORM “是的,該類型可以為空,但在我的配置中不應該是這種情況”。
因此,當 EF 將生成數據庫時,類型將為“非空”,或者當您的 EF 將在調用數據庫之前驗證實體時,將完成該檢查。
有要求
它與IsRequired
的概念相同,但更復雜一些,因為它在涉及多個表時使用。 例如合同和客戶,一份合同歸一個客戶所有,但一個客戶可以有多個合同。 因此,在數據庫合同表中將有一個指向客戶的外鍵,並且在 class 合同中將有一個名為客戶的(導航)屬性。
public class Contract
{
public Customer Customer { get; set; }
}
public class Customer
{
}
modelBuilder.Entity<Contract>()
.HasRequired(c => c.Customer)
此配置將指示合同對客戶具有導航屬性,這是必需的,這意味着外鍵不能是 null。 如果您希望它可以為空,您應該使用HasOptional
。
WithMany現在你配置了 HasRequired,你就有了 WithMany。 這將表明您可以為一個客戶擁有多個合同(合同有一個擁有許多合同的必需客戶:這是一個“一對多”的關系)。 但這也表明客戶不關心合同:
public class Customer
{
}
在這里,您可以看到客戶 class 沒有合同的(導航)屬性。 如果您不需要客戶 object 來達成合同,這很好。
現在,如果你想擁有這種能力,你需要這樣做:
public class Customer
{
public List<Contract> Contracts { get; set; }
}
modelBuilder.Entity<Contract>()
.HasRequired(c => c.Customer)
.WithMany(cu => cu.Contracts)
在這種情況下,您表明合同與客戶有關系,並且從客戶 object 的角度來看,這種關系導致“合同”屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.