模型生成ASP.NET EntityFramework循环错误

本文关键字:EntityFramework 循环 错误 NET ASP 模型 | 更新日期: 2024-10-18 15:54:17

我有这两个实体:

public class Contact : PrimaryKey
{
    public ICollection<Order> OrdersPlaced {get;set;}
}
public class Order : PrimaryKey
{
    public Contact OrderedBy {get;set;}
    public Guid OrderedById {get;set;}
}

PrimaryKey是我的关键类:

public abstract class PrimaryKey
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [HiddenInput(DisplayValue=false)]
    public Guid Id { get; set; }
}

在我的模型构建器中,我这样做:

modelBuilder.Entity<Contact>()
    .HasMany(c => c.OrdersPlaced)
    .WithRequired(o => o.OrderedBy)
    .WillCascadeOnDelete();

我希望能够删除联系人,并删除所有相关订单!但是,当我删除订单时,我不想删除联系人。

我所做的是抛出一个错误,说外键可能会导致删除循环。。。

我应该这样做吗:

modelBuilder.Entity<Order>()
    .HasRequired(o => o.OrderedBy)
    .WithMany(c => c.OrdersPlaced)
    .WillCascadeOnDelete(false);

模型生成ASP.NET EntityFramework循环错误

我认为EF不会支持这种OOTB。这个答案解释了其他人是如何通过禁用cacsade delete和覆盖delete来做到这一点的。

https://stackoverflow.com/a/13457270/626354

为了能够删除订单,我只需要在删除联系人之前循环并删除它们,这是我自己的级联删除实现!

// item is a contact
var orderIds = item.OrdersPlaced.Select(x => x.Id);
foreach (var orderId in orderIds)
    _repository.Delete(_repository.GetById<Order>(orderId));
_repository.Delete(item);