ASP.NET Core 2.0 MVC EF отношения "один ко многим" и "многие ко многим"

В последние дни я работал над созданием отношений между разными классами. К сожалению, я не могу решить эту проблему, надеюсь, вы сможете мне помочь. Ниже вы можете найти определение проблемы.

У меня следующие классы:

  • BaseEntity
  • Продукт
  • Категория
  • Тег
  • Категория продукта
  • ProductTag

Класс 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) и категорией.
Многие-на-многих между продуктом (подкатегории) и категорией
Многие-на-многих между товаром (тегами) и тегом.

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
732
1

Ответы 1

Сначала несколько вопросов. Вы используете подход, ориентированный на код, да? Поскольку вы используете свойства виртуальной навигации. Просто хочу быть уверенным.

Получаете ли вы в настоящее время какие-либо ошибки, что вы пробовали, что не удается?

Если вы разместите виртуальную собственность, а не другую модель, это даст вам отношение «один ко многим». Если они присутствуют в обеих моделях, вы достигнете отношения «многие ко многим».

В классе продукта добавить

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).

hguner 25.03.2018 01:50

Другие вопросы по теме