我正在使用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 缺失。
问题是什么?如何修复它以便创建两个表?
答案 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应该引发异常,但它只是忽略了第一个配置。