#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
@CaiusJard3. @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. Я не совсем понял, почему это сложно; вы просто копируете код, который я написал, и вставляете его в свой проект. Если вам нужно повторить это с другими столбцами, это упражнение по копированию / вставке / замене..