EF с отношением многие ко многим в одной таблице с другими атрибутами - PullRequest
1 голос
/ 25 января 2020

Я не мог бы сначала установить взаимосвязь «многие ко многим» в одной таблице с кодом ef. Кто-нибудь может мне помочь? У меня есть класс Category и CategoryRelation класс тоже. Класс Categoy имеет много Родительских категорий и много дочерних категорий. Но у меня есть дополнительная опора в качестве DisplayId в CategoryRelation. Мои классы похожи на следующие

Категория:

 public class Category : Base
{
    #region Top Menu
    public int DisplayOrder { get; set; }
    public bool ShowOnTopMenu { get; set; }
    #endregion

    public bool ShowOnTopSelling { get; set; }
    [MaxLength(100)]
    public string Name { get; set; }

    #region Types
    public bool IsPieceType { get; set; }
    public bool IsGildingType { get; set; }
    public bool IsPaperType { get; set; }
    public bool IsSizeType { get; set; }
    public bool IsWeightType { get; set; }
    public bool IsCellophaneType { get; set; }
    public bool IsCuttingType { get; set; }
    public bool IsPrintingType { get; set; }
    #endregion

    public virtual ICollection<CategoryRelation> ChildCategoryList { get; set; }    
    public virtual ICollection<CategoryRelation> ParentCategoryList { get; set; }
    public virtual ICollection<Product> ProductList { get; set; }
    public virtual ICollection<WishList> WishList { get; set; }
    public virtual ICollection<Description> DescriptionList { get; set; }
    public virtual ICollection<Comment> CommentList { get; set; }
    public virtual ICollection<Image> ImageList { get; set; }
    public virtual ICollection<Template> TemplateList { get; set; }
    public virtual ICollection<PromotionCode> PromotionCodeList { get; set; }
}

CategoryRelation;

public class CategoryReletion : Base
    {
        #region Parent Category
        [ForeignKey("ParentCategory")]
        public int ParentId { get; set; }
        public Category ParentCategory { get; set; }
        #endregion

        #region Child Category
        [ForeignKey("ChildCategory")]
        public int ChildId { get; set; }
        public Category ChildCategory { get; set; }
        #endregion
        public int DisplayOrder { get; set; }
    }

Наконец я получаю эту ошибку;

Введение ограничения FOREIGN KEY «FK_dbo.CategoryReletion_dbo.Category_ParentId» в таблицу «CategoryReletion» может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки. *

Ответы [ 3 ]

1 голос
/ 25 января 2020

Работало с этими кодами;

       modelBuilder.Entity<CategoryRelation>()
              .HasKey(c => new { c.ParentId, c.ChildId });

        modelBuilder.Entity<CategoryRelation>()
              .HasRequired(c => c.ParentCategory)
              .WithMany(c => c.ChildCategoryList)
              .HasForeignKey(c => c.ParentId)
              .WillCascadeOnDelete(false);

        modelBuilder.Entity<CategoryRelation>()
            .HasRequired(c => c.ChildCategory)
            .WithMany(c => c.ParentCategoryList)
            .HasForeignKey(c => c.ChildId)
            .WillCascadeOnDelete(false);
0 голосов
/ 25 января 2020

Это происходит из-за множества many to many отношений.

, и у вас есть cascadeDelete On, что означает, что если вы удалите строку, все связанные строки будут удалены, представьте, как это работает на нескольких отношениях, вы можете завершить ордером на удаление удаленной строки.

Так что для решения этой проблемы вам нужно использовать FluentApi, чтобы отключить CascadeDelete

0 голосов
/ 25 января 2020

Вы можете сделать именно так, как вам говорят (я предполагаю, что ваш контекст это имя MyContext)

public class MyContext: DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<CategoryReletion> CategoryReletions { get; set; }

      protected override void OnModelCreating( DbModelBuilder modelBuilder )
      {
         modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
         modelBuilder.Entity<CategoryReletion>()
            .HasRequired( c => c.ParentId)
            .WithRequiredDependent()
            .WillCascadeOnDelete(false);

         modelBuilder.Entity<CategoryReletion>()
            .HasRequired( c => c.ChildId)
            .WithRequiredDependent()
            .WillCascadeOnDelete(false);
      }

}
...