外键实体框架-代码优先迁移

时间:2018-09-21 15:59:46

标签: c# entity-framework asp.net-core-2.0 ef-migrations

我的实体有问题。我正在使用EF代码优先的迁移,但迁移失败并出现以下错误:

  

在表“ OrdersChildsProducts”上引入FOREIGN KEY约束“ FK_OrdersChildsProducts_Orders_OrderId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

这是我的PersonJceProfile实体:

[Table("PersonJceProfiles")]
public class PersonJceProfile : BaseEntity
{
    [ForeignKey("Ces")]
    public int? CeId { get; set; }
    public ICollection<Child> Children { get; set; }
    public Order Order { get; set; }
    public PersonJceProfile()
    {
        Children = new List<Child>();
    }
}

这是我的Order实体:

[Table("Orders")]
public class Order : BaseEntity
{
    [Key]
    public int Id { get; set; }

    //ForeignKey
    [Required]
    [ForeignKey("PersonJceProfiles")]
    public int PersonJceProfileId { get; set; }
    [Required]
    public int OrderStatus { get; set; }
    [Required]
    public bool IsSecurePayment { get; set; }
    public int LeftToPayPersonOrder { get; set; }
    public string Delivery { get; set; }

    public ICollection<OrderChildProduct> OrderChildProduct { get; set; }

    public Order()
    {
        OrderChildProduct = new Collection<OrderChildProduct>();
    }
}

这是我的孩子实体:

[Table("Childrens")]
public class Child :BaseEntity
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    public DateTime? BirthDate { get; set; }

    [Required]
    public string Gender { get; set; }

    public bool? IsActif { get; set; }

    public decimal AmountParticipationCe { get; set; }

    public bool? IsRegrouper { get; set; }

    [Required]
    [ForeignKey("PersonJceProfiles")]
    public int PersonJceProfileId { get; set; }
}

这是我的产品实体

public class Product : Good
{
    public string File { get; set; }
    public bool? IsDisplayedOnJCE { get; set; }
    public bool? IsBasicProduct { get; set; }
    public int? PintelSheetId { get; set; }
    public int OriginId { get; set; }

    [Required]
    [ForeignKey("Suppliers")]
    public int SupplierId { get; set; }

}

这是我的OrderChildProduct实体:

 [Table("OrdersChildsProducts")]
public class OrderChildProduct
{
    public int OrderId { get; set; }
    public int ChildId { get; set; }
    public int ProductId { get; set; }
    public int LeftToPayChildOrder { get; set; }

    public Order Order { get; set; }
    public Child Child { get; set; }
    public Product Product { get; set; }

}

这是我的上下文:

modelBuilder.Entity<OrderChildProduct>().HasKey(ccp => new { ccp.OrderId, ccp.ChildId, ccp.ProductId });

我想我确实破坏了这样的关系:

modelBuilder.Entity<Entity>()
.HasRequired(c => c.ForeignKey)
.WithMany()
.WillCascadeOnDelete(false);

但是我看不到它们之间。因为

  • 当我删除PersonJceProfiles时:必须删除订单-必须删除OrderChildProduct-必须删除子项

  • 当我删除Order时:必须删除OrderChildProduct

  • 当我删除Order childProduct时:期望自己不要删除任何东西

我在做什么错?谢谢

1 个答案:

答案 0 :(得分:0)

错误是自我描述的。您必须在OrderChildProduct表中配置关系,例如:

entity.HasOne(p => p.Order)
    .WithMany(p => p.OrderChildProduct)
    .HasForeignKey(p => p.OrderId)
    .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);

您可以根据需要使用RestrictCascade。 另外,还必须定义其他两个关系。

这不是错误。这更像是一个警告... EF告诉您它不完全了解这些关系的方式,因此您必须手动配置它们。