代码优先的数据库映射,多表对多关系

时间:2015-08-13 15:05:34

标签: asp.net entity-framework webforms many-to-many dbcontext

我正在使用Entity Framework 6.1构建ASP.NET webforms应用程序,使用代码优先方法生成数据库。我有两个表,产品标签,在多对多关系中。课程如下:

public class Product
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public long Id { get; set; }
    public string Name { get; set; }

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

我希望这种关系中的两个联结表 ProductTags ProductTagsTradeFor 。所以我覆盖了 WebsiteDbContext OnModelCreating

modelBuilder.Entity<Product>().HasMany<Tag>(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTags");
    });
modelBuilder.Entity<Product>().HasMany<Tag>(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTradeForTags");
    });

运行应用程序后,数据库已创建,表格 ProductTradeForTags 存在,但表 ProductTags 缺失。

问题是什么?如何修复它以便创建两个表?

2 个答案:

答案 0 :(得分:1)

您无法共享导航属性。您需要为每个导航集添加第二组导航:

public class Product
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<Tag> TradeForTags { get; set; }
}

public class Tag
{
    public long Id { get; set; }
    public string Name { get; set; }

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

然后

modelBuilder.Entity<Product>().HasMany(s => s.Tags).WithMany(c => c.Products)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTags");
    });
modelBuilder.Entity<Product>().HasMany(s => s.TradeForTags).WithMany(c => c.TradeForProducts)
    .Map(cs =>
    {
        cs.MapLeftKey("ProductId");
        cs.MapRightKey("TagId");
        cs.ToTable("ProductTradeForTags");
    });

答案 1 :(得分:0)

您的模型需要从标签导航到产品,从产品导航到标签 在这种情况下,一个关联表就足够了 EF应该引发异常,但它只是忽略了第一个配置。