[英]How to allow cascade delete for complex object that has two lists of other complex objects?
我正在努力使它工作。
我希望有一個Dealer
,該Dealer
具有相關的相同類型的Items
兩個清單,但我也希望能夠級聯刪除它們。
public class Dealer
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public List<Car> OldCars { get; set; } = new List<Car>();
public List<Car> NewCars { get; set; } = new List<Car>();
}
public class Car
{
[Key]
public Guid Id { get; set; }
public string Model { get; set; }
public Dealer Dealer { get; set; }
}
我一直在嘗試:
嘗試#1
modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.OldCars)
.HasForeignKey(x => x.Dealer)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.NewCars)
.HasForeignKey(x => x.Dealer)
.OnDelete(DeleteBehavior.Cascade);
System.InvalidOperationException:不能將“經銷商”用作實體類型“汽車”的屬性,因為它已配置為導航。
嘗試#2同時:
modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.NewCars)
.HasPrincipalKey(x => x.Id) <--- Principal!
.OnDelete(DeleteBehavior.Cascade);
它工作正常,但顯示警告
警告:Microsoft.EntityFrameworkCore.Model [10605]在沒有配置外鍵屬性的情況下,“汽車”和“經銷商”之間存在多種關系,導致EF在“汽車”上創建陰影屬性,其名稱取決於發現順序。
不幸的是,在嘗試執行刪除(級聯)時,它引發了一個異常:
SqlException:DELETE語句與REFERENCE約束“ FK_Cars_Dealers_DealerId1”沖突。 數據庫“ testDB”的表“ dbo.Cars”的列“ DealerId1”中發生了沖突。 該語句已終止。
嘗試#3
當我將經銷商的ID添加到汽車中時
public class Car
{
[Key]
public Guid Id { get; set; }
public string Model { get; set; }
public Dealer Dealer { get; set; }
public Guid DealerID { get; set; }
}
大喊
System.Data.SqlClient.SqlException:在這種情況下,無法創建,刪除,啟用或禁用多個名為“ FK_Cars_Dealers_DealerId”的約束,列,索引或觸發器。 不允許重復的名稱。 每個表中的列名必須唯一。 表'Cars'中的列名'DealerId'被多次指定。
#嘗試#3.1
因此,在將Guid DealerID
重命名為例如Guid DealerID123
大喊
SqlException:INSERT語句與FOREIGN KEY約束“ FK_Cars_Dealers_DealerID123”發生沖突。 數據庫“ testDB”的表“ dbo.Dealers”的列“ Id”中發生了沖突。 該語句已終止。
任何人都有一個想法如何使其工作?
感謝Ivan Stoev的建議,我設法解決了以下問題:
public class Dealer
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
[NotMapped]
public List<Car> OldCars { get; set; } => NewCars.Where(c => c.IsOld == true);
public List<Car> NewCars { get; set; } = new List<Car>();
}
public class Car
{
[Key]
public Guid Id { get; set; }
public string Model { get; set; }
public Dealer Dealer { get; set; }
public bool IsOld { get; set; }
}
在EF6 ModelBuilder中,我做了如下操作:
modelBuilder.Entity<Dealer>()
.HasMany(d => d.NewCars)
.WithRequired()
.WillCascadeOnDelete(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.