【问题标题】:many to many mapping with intermediate object in entity framework code first首先在实体框架代码中与中间对象进行多对多映射
【发布时间】:2012-09-07 13:40:49
【问题描述】:

我有一个多对多关系,我想添加一个中间类,这将使我能够使用存储库模式添加多对多关系。

我想不通的是映射。

这是结构

public class Product
{
    public Product()
    {
        Categories = new HashSet<Category>();
    }

    public int  Id { get; set; }
    public string Name { get; set; }

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

public class Category
{
    public int Id { get; set; }
    public String Name { get; set; }

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

}

public class PCMap
{
    public int product_id { get; set; }
    public int category_id { get; set; }

    public Product Product { get; set; }
    public Category Category { get; set; }
}

还有映射

modelBuilder.Entity<Product>()
    .HasEntitySetName("PCMap")
    .HasMany(p=>p.Categories)
    .WithMany(p=>p.Products)
    .Map(m=>
        {
            m.MapLeftKey("product_id");
            m.MapRightKey("category_id");
            m.ToTable("PCMap");
        });

modelBuilder.Entity<PCMap>()
    .ToTable("PCMap");

modelBuilder.Entity<PCMap>().HasKey(k => new
    {
        k.category_id,
        k.product_id
    });

modelBuilder.Entity<PCMap>()
    .HasRequired(p=>p.Product)
    .WithMany()
    .HasForeignKey(p => p.product_id);

modelBuilder.Entity<PCMap>()
    .HasRequired(p => p.Category)
    .WithMany()
    .HasForeignKey(p => p.category_id);

这是我得到的错误.. 我该如何解决 ?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    您的设置方式。 PCMap 是一个非实体,仅用于促进幕后的 M:N 连接。

    Product p = new Product();
    p.Categories ...
    
    Category c = new Category();
    c.Products ...
    

    因为您已经在这里将 PC 定义为产品实体定义的一部分。

    .Map(m=>
            {
                m.MapLeftKey("product_id");
                m.MapRightKey("category_id");
                m.ToTable("PCMap");
            });
    

    我认为您不需要(或者可以)再次定义它,下面分别进行定义。尝试删除所有这些代码。

    modelBuilder.Entity<PCMap>()
        .ToTable("PCMap");
    modelBuilder.Entity<PCMap>().HasKey(k => new
        {
            k.category_id,
            k.product_id
        });
    
    modelBuilder.Entity<PCMap>()
        .HasRequired(p=>p.Product)
        .WithMany()
        .HasForeignKey(p => p.product_id);
    
    modelBuilder.Entity<PCMap>()
        .HasRequired(p => p.Category)
        .WithMany()
        .HasForeignKey(p => p.category_id);
    

    【讨论】:

    • 是的,删除此代码可消除错误。我的问题是 - 我需要访问该表(PCMap)。我想要的是能够直接实例化 PCMap 实例并将其保存到数据库中
    • 啊。那么您不想按照您所做的方式创建映射。相反,您希望拥有像 Product.PCMaps.CategoriesCategory.PCMaps.Products 这样的关系。我不认为你可以同时拥有它。
    • 您不能将实体作为联结点,并保持直接导航属性。见this post
    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2011-05-14
    • 2011-08-29
    • 2013-03-10
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多