[英]ef core 2 - Introducing FOREIGN KEY constraint 'X' on table 'Y' may cause cycles or multiple cascade paths
I know, I know, already exist many questions like that, but I dont find how can I solve this problem in my scenario. 我知道,我已经存在许多类似的问题,但是我找不到在我的方案中如何解决此问题。
I have a customer and a have a seller , a customer not necessary is a seller , but all seller is a customer . 我有一个客户 ,一个有一个卖方 ,一个不必要的顾客是一个卖方 ,但是所有卖方都是一个顾客 。
In my order I have a customer and a seller , but a seller already have a custumer inside him 在我的订单中,我有一个客户和一个卖方 ,但是卖方内部已经有一个客户
It's my Customer Entity 这是我的客户实体
public class Customer : BaseEntity
{
public Customer(Name name, DateTime? birthDay, Email email, string password, List<CreditDebitCard> creditDebitCards = null)
{
[...]
}
public Name Name { get; private set; }
public DateTime? BirthDay { get; private set; }
public Email Email { get; private set; }
public string Password { get; private set; }
public int? CreditDebitCardId { get; private set; }
public ICollection<CreditDebitCard> CreditDebitCards => _CreditDebitCards;
public IEnumerable<Order> Orders { get; private set; }
[...]
}
My Seller Entity 我的卖方实体
public class Seller : BaseEntity
{
public Seller(string schoolName, string cardIdPath, string identityNumber, int customerId)
{
[...]
}
public string SchoolName { get; private set; }
public string CardIdPath { get; private set; }
public string IdentityNumber { get; private set; }
public Customer Customer { get; private set; }
public int CustomerId { get; private set; }
public IEnumerable<Order> Orders { get; private set; }
}
My Order Entity 我的订单实体
public class Order : BaseEntity
{
public Order(IList<OrderItem> orderItems, int customerId, int sellerId)
{
[...]
}
#region Fields
private IList<OrderItem> _orderItems;
#endregion
#region Properties
public int SellerId { get; private set; }
public Seller Seller { get; private set; }
public int CustomerId { get; private set; }
public Customer Customer { get; private set; }
public EOrderStatus Status { get; private set; }
public ICollection<OrderItem> OrderItems
{
get { return _orderItems; }
private set { _orderItems = new List<OrderItem>(value); }
}
public decimal Total => GetTotal();
#endregion
[...]
}
My OrderMap 我的订单图
public static class OrderMap
{
public static EntityTypeBuilder<Order> Map(this EntityTypeBuilder<Order> cfg)
{
cfg.ToTable("ORDER");
cfg.HasKey(x => x.Id);
cfg.Property(x => x.CreationDate).IsRequired();
cfg.Property(x => x.IsActive).IsRequired();
//cfg.Property(x => x.Discount).HasColumnType("money");
cfg.Property(x => x.Status).IsRequired();
cfg.HasMany(x => x.OrderItems);
cfg.HasOne(x => x.Customer);
cfg.HasOne(x => x.Seller).WithMany(b => b.Orders).OnDelete(DeleteBehavior.ClientSetNull);
return cfg;
}
}
I already add a migration, but when i will set 'update-database' I get this error message: 我已经添加了迁移,但是当我设置'update-database'时,会出现以下错误消息:
Introducing FOREIGN KEY constraint 'FK_Order_Seller_SellerId' on table 'Order' may cause cycles or multiple cascade paths. 在表“ Order”上引入FOREIGN KEY约束“ FK_Order_Seller_SellerId”可能会导致循环或多个级联路径。 Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 Could not create constraint or index.
无法创建约束或索引。 See previous errors.
请参阅先前的错误。
it's a .netcore2.0 project and i'm using the ef-core 2 这是一个.netcore2.0项目,我正在使用ef-core 2
Solution 解
I added a seller into Cutomer and mapped it to only the seller have a customer 我将卖方添加到了Cutomer中,并将其映射到只有卖方有客户的情况
cfg.HasOne(x => x.Customer).WithOne(y => y.Seller).HasForeignKey<Customer>(z => z.SellerId);
My Seller map 我的卖家地图
public static class SellerMap
{
public static EntityTypeBuilder<Seller> Map(this EntityTypeBuilder<Seller> cfg)
{
cfg.ToTable("SELLER");
cfg.HasKey(x => x.Id);
cfg.Property(x => x.CreationDate).IsRequired();
cfg.Property(x => x.IsActive).IsRequired();
cfg.HasOne(x => x.Customer).WithOne(y => y.Seller).HasForeignKey<Customer>(z => z.SellerId);
cfg.Property(x => x.CardIdPath).IsRequired();
cfg.Property(x => x.IdentityNumber);
cfg.Property(x => x.SchoolName);
return cfg;
}
}
MY Customer Map 我的客户地图
public static class CustomerMap
{
public static EntityTypeBuilder<Customer> Map(this EntityTypeBuilder<Customer> cfg)
{
cfg.ToTable("CUSTOMER");
cfg.HasKey(x => x.Id);
cfg.Property(x => x.CreationDate).IsRequired();
cfg.Property(x => x.IsActive).IsRequired();
cfg.Property(x => x.BirthDay).IsRequired();
cfg.OwnsOne(x => x.Email);
cfg.OwnsOne(x => x.Name);
cfg.HasMany(x => x.CreditDebitCards).WithOne(y => y.Customer);
//cfg.HasOne(x => x.Seller).WithOne(y => y.Customer).IsRequired(false);
return cfg;
}
}
My Seller entity 我的卖方实体
public class Seller : BaseEntity
{
public Seller(string schoolName, string cardIdPath, string identityNumber, int customerId)
{
SchoolName = schoolName;
CardIdPath = cardIdPath;
IdentityNumber = identityNumber;
CustomerId = customerId;
}
public string SchoolName { get; private set; }
public string CardIdPath { get; private set; }
public string IdentityNumber { get; private set; }
public Customer Customer { get; private set; }
public int CustomerId { get; private set; }
public IEnumerable<Product> Products { get; private set; }
public int? ProductId { get; private set; }
public IEnumerable<Order> Orders { get; private set; }
}
}
My Customer entity 我的客户实体
public class Customer : BaseEntity
{
public Customer(Name name, DateTime? birthDay, Email email, string password, List<CreditDebitCard> creditDebitCards = null)
{
CreationDate = DateTime.Now;
Name = name;
BirthDay = birthDay;
Email = email;
Password = password;
_CreditDebitCards = creditDebitCards ?? new List<CreditDebitCard>();
}
#region Fields
private IList<CreditDebitCard> _CreditDebitCards;
#endregion
#region Properties
public Name Name { get; private set; }
public DateTime? BirthDay { get; private set; }
public Email Email { get; private set; }
public string Password { get; private set; }
public int? CreditDebitCardId { get; private set; }
public ICollection<CreditDebitCard> CreditDebitCards => _CreditDebitCards;
public IEnumerable<Order> Orders { get; private set; }
public Seller Seller { get; private set; }
public int SellerId { get; private set; }
#endregion
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.