首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心中的Conventions.Remove<OneToManyCascadeDeleteConvention>()?

EF核心中的Conventions.Remove<OneToManyCascadeDeleteConvention>()?
EN

Stack Overflow用户
提问于 2018-03-02 15:52:58
回答 1查看 5.7K关注 0票数 0

在我的常规.NET框架应用程序中,我使用的是EF 6.x,并且还使用了一些继承,特别是:

PurchaseOrder.csSaleOrder.cs都继承了Order.cs

在从IdentityDbContext继承的上下文类上的IdentityDbContext中,我所做的是:

代码语言:javascript
复制
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

这过去是可行的,但现在我将我的应用程序移到.NET Core2.0,并且我使用的是EF。在EF核心中实现同样的目标是什么?因为现在我发现了一个错误:

System.Data.SqlClient.SqlException (0x80131904):在表'Order‘上引入外键约束'FK_Order_Business_CustomerId’可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。

更新

这是阿玛尔回答后的密码。在我的课文课上,我有:

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder builder)
{
  base.OnModelCreating(builder);
  builder.HasDefaultSchema("PD");

  builder.Entity<Customer>()
    .HasMany(c => c.SaleOrders)
    .WithOne(e => e.Customer)
    .OnDelete(DeleteBehavior.SetNull);

  builder.Entity<Supplier>()
    .HasMany(po => po.PurchaseOrders)
    .WithOne(e => e.Supplier)
    .OnDelete(DeleteBehavior.SetNull);

  builder.Entity<PurchaseOrder>()
    .HasMany(li => li.LineItems)
    .WithOne(po => po.PurchaseOrder)
    .OnDelete(DeleteBehavior.SetNull);

  builder.Entity<SaleOrder>()
    .HasMany(li => li.LineItems)
    .WithOne(po => po.SaleOrder)
    .OnDelete(DeleteBehavior.SetNull);
}

就实体而言,它们是:

代码语言:javascript
复制
public abstract class Business : IEntity
{
  protected Business()
  {
    CreatedOn = DateTime.UtcNow;
  }

  public int Id { get; set; }
  public string Name { get; set; }
  public string TaxNumber { get; set; }
  public string Description { get; set; }
  public string Phone { get; set; }
  public string Website { get; set; }
  public string Email { get; set; }
  public bool IsDeleted { get; set; }
  public DateTime CreatedOn { get; set; }
  public DateTime? ModifiedOn { get; set; }
  public ICollection<Address> Addresses { get; set; } = new List<Address>();
  public ICollection<Contact> Contacts { get; set; } = new List<Contact>();
}

[Table("Customers")]
public class Customer : Business
{
  public decimal AllowedCredit { get; set; }
  public decimal CreditUsed { get; set; }
  public int NumberOfDaysAllowedToBeOnMaxedOutCredit { get; set; }
  public ICollection<SaleOrder> SaleOrders { get; set; }
}

[Table("Suppliers")]
public class Supplier : Business
{
  public ICollection<PurchaseOrder> PurchaseOrders { get; set; }
}

public abstract class Order : IEntity
{
  protected Order()
  {
    Date = DateTime.UtcNow;
    CreatedOn = DateTime.UtcNow;
  }

  public int Id { get; set; }
  public DateTime Date { get; set; }
  public decimal ShippingCost { get; set; }
  public Currency ShippingCurrency { get; set; }
  public decimal ShippingConversionRate { get; set; }
  public bool IsDeleted { get; set; }
  public DateTime CreatedOn { get; set; }
  public DateTime? ModifiedOn { get; set; }
  public ICollection<Invoice> Invoices { get; set; }
  public ICollection<Note> Notes { get; set; }
}

[Table("PurchaseOrders")]
public class PurchaseOrder : Order
{
  public int SupplierOrderNumber { get; set; }
  public PurchaseOrderStatus Status { get; set; }
  public decimal Vat { get; set; }
  public decimal ImportDuty { get; set; }
  public int SupplierId { get; set; }
  public Supplier Supplier { get; set; }
  public ICollection<PurchaseOrderLineItem> LineItems { get; set; }
}

[Table("SaleOrders")]
public class SaleOrder : Order
{
  public decimal AmountToBePaidOnCredit { get; set; }
  public SaleOrderStatus Status { get; set; }
  public ICollection<SaleOrderLineItem> LineItems { get; set; }
  public int CustomerId { get; set; }
  public Customer Customer { get; set; }
}

因此,在完成了Ahmar的建议之后,我在执行update-database时仍然会遇到同样的错误。

EN

回答 1

Stack Overflow用户

发布于 2018-03-03 04:12:41

您需要对.Net核心EF中的每个实体配置级联删除行为。

OnDelete方法用于指定当主体被删除时应该在关系中的依赖实体上发生的操作。

OnDelete方法将DeleteBehavior枚举作为参数:

  • 应删除级联依赖项。
  • 限制-受抚养人不受影响
  • SetNull -相依行中的外键值应该更新为NULL

示例:

代码语言:javascript
复制
public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Employee> Employees { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? CompanyId { get; set; }
    public Company Company { get; set; }
}

protected override void OnModelCreating(Modelbuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .HasMany(c => c.Employees)
        .WithOne(e => e.Company).
        .OnDelete(DeleteBehavior.SetNull);
}

删除公司时,它将将Employee表中的CompanyId属性设置为空。

配置一个到多个关系获得更多详细信息

PS.请确保您的所有引用属性都为空,以便EF可以在删除时将其设置为空。就像“关于例子”中的CompanyId

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49072686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档