簡體   English   中英

如何允許級聯刪除具有兩個其他復雜對象列表的復雜對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM