【问题标题】:Model Building ASP.NET EntityFramework Cyclic Error模型构建 ASP.NET EntityFramework 循环错误
【发布时间】:2013-12-17 17:29:32
【问题描述】:

我有这两个实体:

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);

【问题讨论】:

  • 您发布的实体不会导致 FK 循环错误。您的模型中一定有其他实体导致了问题。
  • 不可能,我加了这2个,报错了。我用第二个替换了第一个模型构建器代码,运行了迁移并且它工作了。
  • 你的实体类并不完整——它们没有开始的键。我刚刚将这两个类(使用适当的键)添加到一个空模型中,并且没有错误。
  • @RichardDeeming 请查看编辑。
  • 我刚刚用基类中定义的键再次尝试,它按预期工作。

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

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

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

【讨论】:

  • 开箱即用。我的意思是,没有简单的内置方法可以做你想做的事。
【解决方案2】:

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

// 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多