我有這樣的 3 種多對多關系:
table 1 skill
table 2 instructions
table 3 person
現在我需要有一種方法來為技能和人員的組合設定指令串列。我正在考慮擁有 1 個表,其中包含此映射 SkillId、InstructionId 和 PersonId。我試圖用 HasOne.Withmany.HasForeignKey 設定它,但它不起作用。我收到一個錯誤
無法將屬性或導航“Instruction”添加到物體型別“PersonSkillInstruction”,因為物體型別“PersonSkillInstruction”上已存在同名的屬性或導航
如果我只設定主鍵并讓 .netcore 5.0 幫我解決問題,我會收到另一個錯誤
屬性“PersonSkillInstruction.Instruction”屬于“InstructionEntity”型別,當前資料庫提供程式不支持該屬性。更改屬性 CLR 型別,或使用“[NotMapped]”屬性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略該屬性
我知道我可以做一些事情,比如為人和技能創建多對多并設定一個 id,然后將它與指令結合使用,但感覺很可疑。
我怎樣才能使這 3 種方式多對多作業?
我正在使用 .netcore 5.0、ef core、code first 和 sqlserver
uj5u.com熱心網友回復:
我認為正確的做法是你所說的:
我知道我可以做一些事情,比如為人和技能創建多對多并設定一個 id,然后將它與指令結合使用
不過,如果您想創建 PersonSkillInstruction 表,這里有一個示例。
public class PersonSkillInstruction
{
[ForeignKey("person")]
public int PersonId { get; set; }
[ForeignKey("skill")]
public int SkillId { get; set; }
[ForeignKey("instructions")]
public int InstructionId { get; set; }
public virtual Person Person { get; set; }
public virtual Skill Skill { get; set; }
public virtual Instruction Instruction { get; set; }
}
然后需要在DBContext中設定PK如下:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<PersonSkillInstruction>()
.HasKey(t => new { t.PersonId, t.SkillId, t.InstructionId });
// ...
添加新遷移后,您必須參考這樣的兩個操作以避免回圈:
// ...
onDelete: ReferentialAction.Restrict
// ...
如果該表將有大量查詢,我建議使用具有唯一索引的代理鍵,如下所示:
modelBuilder.Entity<PersonSkillInstruction>()
.HasIndex(t => new { t.PersonId, t.SkillId, t.InstructionId })
.IsUnique();
關于代理鍵的鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377998.html
標籤:sql-server 实体框架 .net-5
