ef core 2 - 在表“Y”上引入 FOREIGN KEY 约束“X”可能会导致循环或多个级联路径

伊塔洛·何塞

我知道,我知道,已经存在很多这样的问题,但我不知道如何在我的场景中解决这个问题。

我有一个客户,一个有一个卖家,一个不需要客户就是卖家,但所有卖家都是客户

在我的订单中,我有一个客户和一个卖家,但卖家内部已经有了一个客户

这是我的客户实体

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

我的订单地图

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

我已经添加了迁移,但是当我设置“更新数据库”时,我收到此错误消息:
在表“订单”上引入 FOREIGN KEY 约束“FK_Order_Seller_SellerId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。

这是一个 .netcore2.0 项目,我正在使用 ef-core 2

伊塔洛·何塞

解决方案
我在 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

全局禁用EF Core 2上的级联删除

引入FOREIGN KEY约束可能会导致循环或多个级联路径-为什么?

引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定删除时不执行任何操作

实体框架核心:如何解决?引入外键约束可能会导致循环或多个级联路径

可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

FK约束可能会导致循环或多个级联路径

EF Core-可能导致循环或多个级联路径

在EF Core 2的自引用表中实现级联删除

UPDATE语句与EF Core中的FOREIGN KEY约束冲突

SQL错误:引入FOREIGN KEY约束可能会导致循环或多个级联路径。实体框架核心

具有相同必需属性类型的EF Core TPH实体导致“引入FOREIGN KEY约束”异常

EF Core DeleteBehavior.Cascade可能会导致循环或多个级联路径

无法执行DbCommand引入的FOREIGN KEY约束

如何防止错误:在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径

在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径,即使在完全删除受影响的字段之后也是如此

引入FOREIGN KEY约束-数据库设置

EF迁移:ALTER TABLE语句与FOREIGN KEY约束冲突

FOREIGN KEY可能会导致循环或多个级联路径异常

EF代码优先INSERT语句与FOREIGN KEY约束冲突

在表“ Employer”上引入FOREIGN KEY约束“ FK__Employer__postal__59FA5E80”可能会导致循环或多个级联路径

引入FOREIGN KEY约束可能会导致循环或多个级联路径

INSERT语句与Entity Framework Core中的FOREIGN KEY约束冲突

由于级联删除而导致的“ FOREIGN KEY约束引入”

SQL Server 引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

SqlException: INSERT 语句与 FOREIGN KEY 约束冲突,首先使用 EF 代码 C#

在表 'Y' 上引入 FOREIGN KEY 约束 'X' 可能会导致循环或多个级联路径

在表 'ReservedSeats' 上引入 FOREIGN KEY 约束 'FK_ReservedSeats_Seats_SeatId' 可能会导致循环或多个级联路径

Microsoft SMSS - 在 t2.primary key = t1.foreign_key 上加入表

Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径