我正在嘗試對 EF 模型進行一些更改,但遇到了級聯洗掉問題,我知道我以前做過,但找不到我滿意的解決方案。
這是現有模型的一個示例,我嘗試使用一些通用的東西,我們都會認識到(學校和學生/教師)之間的真實世界關系:
namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}
public class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }
public string TeachersUnionId { get; set; }
}
}
這為我們提供了資料庫中的 School 表,與 person 表之間存在一對多關系。
我們想要做的是使人不那么通用,并將它們分成教師物件和學生物件。
我這樣做是這樣的:
namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
}
public abstract class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }
}
public class Teacher : Person
{
public string TeachersUnionId { get; set; }
}
public class Student : Person
{
public string StudentUnionId { get; set;}
}
}
在 DB 中,它為我們提供了相同的結構,在 person 表上有一個 2 many 的 school 表,但 person 表現在有一個鑒別器,以便 EF 可以區分學生和教師。
這很好并且按預期作業,我現在遇到的問題是我想將來自 School 物件的導航屬性添加到學生和教師。
我們分兩步完成,首先是教師,所以學校物件變為:
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}
這很有效,使我們能夠從一所學校導航到一組教師。
現在我們要添加學生導航屬性,因此我們將學校物件修改為
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
public IList<Student> Students { get; set; }
}
但是當我們為此應用遷移時,我們得到
在表“Person”上引入 FOREIGN KEY 約束“FK_NAME”可能會導致回圈或多個級聯路徑。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。
我通常對 EF 很好——但我很難弄清楚為什么這次它不起作用——正如我所說的,我確信我們以前使用過這種結構。
這是一個使用 .net 5 和 Ef Core 的 C# 專案。
有任何想法嗎?
uj5u.com熱心網友回復:
您可以通過OnDelete(DeleteBehavior.ClientCascade)指定明確指定所需的洗掉行為
builder.HasOne(d => d.Prop1)
.WithMany(p => p.Prop2)
.HasForeignKey(d => d.Prop3)
.OnDelete(DeleteBehavior.ClientCascade)
.HasConstraintName("FK_Table1_Table2");
DeleteBehaviorenum 還有其他選項Cascade,例如ClientSetNull等
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517091.html
上一篇:當IDENTITY_INSERT設定為OFF時,無法在表中插入標識列的顯式值-EFCore多對多(子)資料
下一篇:單一背景關系型別,多個提供者
