В последние дни я работал над созданием отношений между разными классами. К сожалению, я не могу решить эту проблему, надеюсь, вы сможете мне помочь. Ниже вы можете найти определение проблемы.
У меня следующие классы:
Класс BaseEntity:
public class BaseEntity
{
public long Id { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
public BaseEntity { }
}
Класс продукта:
public class Product: BaseEntity
{
public string Name { get; set; }
public string Description { get; set; }
public long CategoryId { get; set; }
public virtual Category MainCategory { get; set; }
public virtual ICollection<ProductSubCategory> ProductSubCategories { get; set; }
public virtual ICollection<ProductTag> ProductTags { get; set; }
}
Категория Класс:
public class Category : BaseEntity
{
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Product> Products { get; set; }
public virtual ICollection<ProductSubCategory> ProductSubCategories{ get; set; }
}
Класс тега:
public class Tag: BaseEntity
{
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<ProductTag> ProductTags { get; set; }
}
ProductSubCategory Класс:
public class ProductSubCategory : BaseEntity
{
public long ProductId { get; set; }
public Product Product{ get; set; }
public long SubCategoryId { get; set; }
public Category Category { get; set; }
}
ProductTag Класс:
public class ProductTag: BaseEntity
{
public long ProductId { get; set; }
public Product Product{ get; set; }
public long TagId { get; set; }
public Tag Tags { get; set; }
}
Товар имеет одну основную категорию. (один ко многим)
У продукта может быть много подкатегорий. (многие-на-многих)
У продукта может быть много тегов. (многие-на-многих)
Мои карты классов выглядят так:
ProductMap:
public ProductMap(EntityTypeBuilder<Product> entityBuilder)
{
entityBuilder.HasOne(p => p.MainCategory)
.WithMany(c => c.Products)
.HasForeignKey(p => p.CategoryId)
.OnDelete(DeleteBehavior.SetNull);
}
ProductSubCategoryMap:
public ProductSubCategoryMap(EntityTypeBuilder<ProductSubCategory> entityBuilder)
{
entityBuilder
.HasKey(psc=> new { psc.ProductId, psc.CategoryId });
entityBuilder
.HasOne<Product>(psc => psc.Product)
.WithMany(p => p.ProductSubCategories)
.HasForeignKey(psc => psc.ProductId);
entityBuilder
.HasOne<Category>(psc=> psc.Category)
.WithMany(sc => sc.ProductSubCategories)
.HasForeignKey(psc => psc.CategoryId);;
}
ProductTagMap:
public ProductTagMap(EntityTypeBuilder<ProductTag> entityBuilder)
{
entityBuilder
.HasKey(pt => new { pt.ProductId, pt.TagId});
entityBuilder
.HasOne<Product>(pt => pt.Product)
.WithMany(p => p.ProductTags)
.HasForeignKey(pt=> pt.ProductId);
entityBuilder
.HasOne<Tag>(pt => pt.Tag)
.WithMany(t => t.ProductTags)
.HasForeignKey(pt => pt.TagId);
}
Как установить:
Один ко многим между продуктом (MainCategory) и категорией.
Многие-на-многих между продуктом (подкатегории) и категорией
Многие-на-многих между товаром (тегами) и тегом.
Заранее спасибо.





Сначала несколько вопросов. Вы используете подход, ориентированный на код, да? Поскольку вы используете свойства виртуальной навигации. Просто хочу быть уверенным.
Получаете ли вы в настоящее время какие-либо ошибки, что вы пробовали, что не удается?
Если вы разместите виртуальную собственность, а не другую модель, это даст вам отношение «один ко многим». Если они присутствуют в обеих моделях, вы достигнете отношения «многие ко многим».
В классе продукта добавить
public virtual Catagory Catagory { get; set; }
Если вам нужно, чтобы это была коллекция, добавьте ее, как в других, и, возможно, назовите ICollection Catagories вместо единственного числа.
public virtual ICollection<Catagory> Catagories { get; set; }
Привет, BenCdev, спасибо за ответ! Да, я использую подход "сначала код". В какой-то момент у меня было столько ошибок, что я решил начать с нового решения. Решил удалить в виртуальный и последовал твоему совету. К сожалению, я не могу его протестировать, потому что я не могу выполнять миграции (у меня есть 4 разных проекта, 3 библиотеки классов: Data, Repository, Service и одно веб-приложение Core MVC под названием Web). В настоящий момент я не могу выполнить миграции в проекте Repository (я переместил папку миграции и классы по умолчанию в Repository).