我已经开始为项目的后端部分工作,目前,我正在尝试使用 EF核心代码生成数据库 -首先,但是当我尝试运行迁移迁移(与级联删除有关)时遇到了问题)。
首先,我将在数据库的 ERD 和类下附加我在C#中创建的内容:
和相应的分类是:
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 ,但是我不确定如果我真的应该这样做,以及从长远来看将如何影响我的应用程序。
我该怎么做才能解决此问题,这是最佳做法?
答案 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不会满意的某些行为。