#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. При переносе надстройки не было обнаружено никаких ошибок, и сценарий был сгенерирован. Вышеуказанная ошибка возникла при обновлении базы данных после миграции