Как определить внешний ключ в ядре Entity Framework

#entity-framework #entity-framework-core #foreign-keys

Вопрос:

Я пытаюсь достичь приведенной ниже структуры таблицы, но получаю ошибку «не может использоваться в качестве свойства для типа сущности, поскольку он настроен как навигация».

Кто-нибудь может мне помочь.

Категория:

ID Имя
1 cat1
2 cat2
3 cat3
4 cat4

Подкатегория:

ID Идентификатор категории Имя
1 1 Подкат1
2 1 Подкат2
3 1 Подкат3
1 2 Подкат4
1 3 Подкат5
2 3 Подкат6

Предмет:

ID Категория ид Подкатегорияид Имя
1 1 2 пункт 1
2 3 2 пункт 2
3 1 нулевой пункт 3
4 4 нулевой пункт 4
 public class Category
{
    [Key]
    public int Id { get; set; }

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

    public virtual ICollection<HrCodeSubType> SubCategories { get; set; }

}

public class SubCategory
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

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

public class Item
{
    [Key]
    public int Id { get; set; }

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

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category{ get; set; }


    public int? SubCategoryId { get; set; }
    public virtual SubCategory SubCategory { get; set; }
  }
 

Свободный Api

 builder.Entity<Item>().HasOne(x => x.SubCategory)
         .WithMany().HasForeignKey(x => new { x.CategoyId, x.SubCategoyId });
 

Ответ №1:

оставьте в классе товара только подкатегорию, так как она уже зависит от категории и имеет отношение один к одному

 public class Item
{
    [Key]
    public int Id { get; set; }

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

    
    public int? SubCategoryId { get; set; }
    public virtual SubCategory SubCategory { get; set; }
  }
 

и если вы используете net core 5 , вам не нужны какие-либо свободные API, просто добавьте свойство navigaion в подкатегорию

 public class SubCategory
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

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

   public virtual ICollection<Item> Items{ get; set; }

}

public class Category
{
    [Key]
    public int Id { get; set; }

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

    public virtual ICollection<SubCategory> SubCategories { get; set; }

}
 

Комментарии:

1. Спасибо за ответ. Но там будут товары только с категорией, а подкатегория пуста. Этого можно добиться, если я удалю категорию и оставлю только подкатегорию

2. @mohammedali Вы должны сохранить ту же структуру, иначе рано или поздно у вас будут большие проблемы. Просто создайте поддельную подкатегорию, которую вы можете назвать, например, «Без подкатегории».

3. Я получаю ошибку при обновлении базы данных после удаления свойства категории из элемента . Свойство «Item.SubCategory» имеет тип «Подкатегория», который не поддерживается текущим поставщиком базы данных. Либо измените тип CLR свойства, либо проигнорируйте свойство, используя атрибут ‘[NotMapped]’ или используя ‘EntityTypeBuilder. Игнорировать» в «При создании модели»

4. @mohammedali после внесения изменений вам придется выполнить миграцию базы данных инициализации.

5. При переносе надстройки не было обнаружено никаких ошибок, и сценарий был сгенерирован. Вышеуказанная ошибка возникла при обновлении базы данных после миграции