Внешний ключ Entity Framework - код первой миграции - PullRequest
0 голосов
/ 21 сентября 2018

У меня проблема с моими сущностями.Я использую EF-миграцию с первым кодом, и миграции завершаются с ошибкой:

Введение ограничения FOREIGN KEY 'FK_OrdersChildsProducts_Orders_OrderId' для таблицы 'OrdersChildsProducts' может вызывать циклы или множественные каскадные пути.Укажите 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>();
    }
}

Вот мой объект Child:

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

Вот мой объект Product

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 голосов
/ 21 сентября 2018

Ошибка описывается самостоятельно.Вы должны настроить отношения в таблице OrderChildProduct следующим образом:

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

Вы можете использовать Restrict или Cascade в зависимости от ваших требований.Также должны быть определены и другие 2 отношения.

Это не ошибка.Это больше похоже на предупреждение ... способ, которым EF говорит вам, что он не полностью понимает отношения, и вы должны настроить их вручную.

...