EF核心代码优先迁移级联删除问题

时间:2020-01-12 12:18:11

标签: c# database entity-framework-core ef-code-first

我已经开始为项目的后端部分工作,目前,我正在尝试使用 EF核心代码生成数据库 -首先,但是当我尝试运行迁移迁移(与级联删除有关)时遇到了问题)。

首先,我将在数据库的 ERD 下附加我在C#中创建的内容:

enter image description here

和相应的分类是:

Account.cs

public class Account
{
   public int Id { get; set; }
   public string Email { get; set; }
   public string ExternalAccountId { get; set; }

   public int CustomerId { get; set; }
   public Customer Customer { get; set; }
}

BillingAddress.cs

public class BillingAddress
{
   public int Id { get; set; }
   public string Address { get; set; }

   public int CustomerId { get; set; }
   public Customer Customer { get; set; }

   public List<Payment> Payments { get; set; }
}

BillingDetail.cs

public class BillingDetail
{
   public int Id { get; set; }
   public int CreditCardNumber { get; set; }
   public DateTime ExpirationDate { get; set; }
   public short Cvv { get; set; }

   public int CustomerId { get; set; }
   public Customer Customer { get; set; }

   public List<Payment> Payments { get; set; }
}

Customer.cs

public class Customer
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string PhoneNumber { get; set; }
   public int Cnp { get; set; }

   public Account Account { get; set; }

   public List<BillingDetail> BillingDetails { get; set; }

   public List<BillingAddress> BillingAddresses { get; set; }

   public List<Rental> Rentals { get; set; }
}

Payment.cs

public class Payment
{
    public int Id { get; set; }

    public int RentalId { get; set; }
    public Rental Rental { get; set; }

    public int BillingDetailId { get; set; }
    public BillingDetail BillingDetail { get; set; }

    public int BillingAddressId { get; set; }
    public BillingAddress BillingAddress { get; set; }
}

Rental.cs

public class Rental
{
   public int Id { get; set; }
   public DateTime PickupDate { get; set; }
   public DateTime DropoffDate { get; set; }

   public int CustomerId { get; set; }
   public Customer Customer { get; set; }

   public List<Payment> Payments { get; set; }

   public List<RentalVehicle> RentalVehicles { get; set; }
}

RentalVehicle.cs

public class RentalVehicle
{
   public int Id { get; set; }

   public int RentalId { get; set; }
   public Rental Rental { get; set; }

   public int VehicleId { get; set; }
   public Vehicle Vehicle { get; set; }
}

Vehicle.cs

public class Vehicle
{
   public int Id { get; set; }
   public string Model { get; set; }
   public string Brand { get; set; }
   public string Color { get; set; }
   public short ManufactureYear { get; set; }
   public string Vin { get; set; }
   public int Mileage { get; set; }
   public short Horsepower { get; set; }
   public string GearBox { get; set; }
   public byte EngineSize { get; set; }
   public float Price { get; set; }
   public byte NoDoors { get; set; }

   public List<RentalVehicle> RentalVehicles { get; set; }
}

我已经生成了迁移,当我尝试运行它时,出现了这样的错误:

Introducing FOREIGN KEY constraint 'FK_Payments_BillingDetails_BillingDetailId' on table 'Payments' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我已经找到一些解决方法,可以在迁移中将 onDelete ReferentialAction.Cascade 替换为 ReferentialAction.NoAction ,但是我不确定如果我真的应该这样做,以及从长远来看将如何影响我的应用程序。

我该怎么做才能解决此问题,这是最佳做法?

1 个答案:

答案 0 :(得分:2)

如果您正在编辑迁移,则可能需要更改实体的配置。

示例:

public class PaymentsConfiguration : IEntityTypeConfiguration<Payments>
    {
        public override void Configure(EntityTypeBuilder<Payments> builder)
        {
            builder.HasOne(x => x.BillingDetail).WithMany().OnDelete(DeleteBehavior.Restrict);
            builder.HasOne(x => x. BillingAddress).WithMany().OnDelete(DeleteBehavior.Restrict); //maybe you need to do this too
            builder.HasOne(x => x. Rental).WithMany().OnDelete(DeleteBehavior.Restrict); //maybe you need to do this too
        }
    }

我将查看以下有关配置的文档/教程:

在我过去所做的项目中,一些主要的开发人员建议我不要级联删除。尽可能方便,您应该注意要删除哪些数据... EF Core非常有用,但有时它会使您默认使用DBA不会满意的某些行为。