2017-10-20 60 views
0

我知道,我知道已經存在許多像這樣的問題,但我不知道如何解決此問題我的場景。ef core 2 - 在表'Y'中引入FOREIGN KEY約束'X'可能會導致循環或多個級聯路徑

我有一個客戶一個有賣家,一個客戶沒有必要是賣家,但所有賣家客戶

在我爲了我有一個客戶賣家,但賣家已經有一個custumer內他

這是我的客戶實體

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; } 
     [...] 
} 

我賣方實體

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

    } 

我的訂單實體

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 
     [...] 
    } 

我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; 
     } 
    } 

我已經添加遷移,但是當我將「更新數據庫」我收到此錯誤信息:
引進國外KEY 'Order'表上的約束'FK_Order_Seller_SellerId'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束或索引。查看以前的錯誤。

這是一個.netcore2.0項目,我使用的是EF-核心2

+0

你的代碼示例是不是很清楚。你寫的map函數看起來不像ef core 2.0。 –

回答

0

解決方案
我加了賣家進入CUTOMER並映射到只有賣方有一個客戶

cfg.HasOne(x => x.Customer).WithOne(y => y.Seller).HasForeignKey<Customer>(z => z.SellerId); 

我的賣家地圖

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

我的客戶地圖

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

我對賣家的實體

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

    } 
} 

我的客戶實體

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 
相關問題