Сначала создание кода отношений «многие ко многим»

#c# #migration #ef-code-first #many-to-many

#c# #миграция #ef-code-first #многие ко многим

Вопрос:

Я пытаюсь создать отношения «многие ко многим» в C #, используя подход code first. В реальном мире у продукта может быть много категорий, а в категории может быть много продуктов. Итак, это то, что я придумал:

Product.cs:

 public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}
 

Category.cs:

 public class Category
{
    public Category(CategoryEnum @enum)
    {
        Id = (int)@enum;
        Name = @enum.ToString();
    }

    public Category() { }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }


    public static implicit operator Category(CategoryEnum @enum) => new Category(@enum);

    public static implicit operator CategoryEnum(Category category) => (CategoryEnum)category.Id;

}
 

Category Сопоставление с Enum , которое выглядит как:

 public enum CategoryEnum
{
    Electronics = 1,
    Gardening = 2
}
 

Наконец, DbContext выглядит так:

 public class ProductDbContext : DbContext
{
    public DbSet<Entities.Product> Products { get; set; }
    public DbSet<Entities.Category> Categories { get; set; }

    public ProductDbContext(DbContextOptions<ProductDbContext> options)
    : base(options)
    { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}
 

При выполнении миграции я получаю этот результат:

введите описание изображения здесь

Это называется «назовите понравившиеся CategoriesId столбцы», и ProductsId есть ли способ изменить имя этих столбцов?

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

1. Изменить на что?

2. Например CategoryId , и ProductId @CaiusJard

3. @CaiusJard не работает, говорит The [ForeignKey] attribute cannot be specified on the skip navigation 'CategoryId'.'ProductId'. Configure the foreign key properties in 'OnModelCreating' instead

4. Что это за разновидность / версия EF?

5. @CaiusJard EntityFrameworkCore 5.0.2

Ответ №1:

Попробуйте это:

     protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder
            .Entity<Product>()
            .HasMany(p => p.Categories)
            .WithMany(p => p.Products)
            .UsingEntity<Dictionary<string, object>>("ProductCategory",
              right => right.HasOne<Category>()
                .WithMany()
                .HasForeignKey("CategoryId")
                .HasConstraintName("FK_ProductCategory_CategoryId__Category_Id")
                .OnDelete(DeleteBehavior.Cascade),
              left => left.HasOne<Product>()
                .WithMany()
                .HasForeignKey("ProductId")
                .HasConstraintName("FK_ProductCategory_ProductId__Product_Id")
                .OnDelete(DeleteBehavior.Cascade)
          );
    }
 

Это работает:

введите описание изображения здесь

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

1. Что на земле.. не может быть так сложно переименовать созданные столбцы.. верно?

2. Я думаю, вы также можете создать объект среднего человека самостоятельно. Это только верхняя часть кода, которая вам нужна. В конце концов, это автоматически сгенерированная таблица для чего-то, чего вы никогда не увидите в коде — вас действительно волнует, какие имена? 🙂

3. Я не совсем понял, почему это сложно; вы просто копируете код, который я написал, и вставляете его в свой проект. Если вам нужно повторить это с другими столбцами, это упражнение по копированию / вставке / замене..