首先创建多对多关系代码

问题描述

我正在尝试使用代码优先方法在 C# 中创建多对多关系。在现实世界中,一个产品可以有多个类别,一个类别可以有多个产品。所以这就是我想出的:

Product.cs:

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

    public string Name { get; set; }

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

类别.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);
    }
}

运行迁移时,我得到以下结果:

enter image description here

将列命名为 CategoriesIdProductsId 有没有办法更改这些列的名称?

解决方法

试试这个:

    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)
          );
    }

它有效:

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...