如何在同一个实体上创建多对多关系?

时间:2013-06-04 22:01:38

标签: c# entity-framework many-to-many code-first

例如,我有Poduct实体:

public class Product : DatabaseEntity
{
    public int Id {get; set;}
    public int Name {get; set;}
    public decimal Price {get; set;}

    ...
}

我的想法是想为产品创建类似产品的可编辑集合。所以它就像多对多但是在同一个实体 - 产品所以我更新了我的模型,如下所示:

public class Product : DatabaseEntity
{
    public int Id {get; set;}
    public int Name {get; set;}
    public decimal Price {get; set;}

    public ICollection<Product> SimilarProducts { get; private set; }
    public void AddSimilar(Product product)
    {
       SimilarProducts.Add(product);
    }

    ...
}

我也更新了我的DbContext课程:

modelBuilder.Entity<Product>()
                .HasMany(p => p.SimilarProducts)
                .WithOptional()
                .WillCascadeOnDelete(false);

实施了编辑产品操作:

public ActionResult Edit(ProductEditModel productEditModel)
{

    if(!string.IsNullOrEmpty(productEditModel.SelectedSimilarProductLinkName))
    {
         var similarProduct = _productRepository.GetProduct(productEditModel.SelectedSimilarProductId);
         product.AddSimilar(similarProduct);
     }
    _productRepository.AddProduct(product);
}

void IProductRepository.AddProduct(产品);

public void AddProduct(Product product)
{
     _repository.InsertOrUpdate(product);
}

但是我得到了奇怪的结果:产品在我的数据库中添加了Product_Id字段,并且没有像ProductProduct表那样存储相关产品ID的东西,就像通常很多实体一样实现。如何手动创建此表?我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:0)

感谢Swell的建议,已经找到了解决方案:

<强>型号:

public class Product : DatabaseEntity
{
    public int Id {get; set;}
    public int Name {get; set;}
    public decimal Price {get; set;}

    public ICollection<Product> ParentSimilars { get; set; }
    public ICollection<Product> ChildSimilars { get; set; }

    [NotMapped]
    public IEnumerable<Product> SimilarProducts
    {
        get
        {
           return ChildSimilars.Concat(ParentSimilars);
        }
    }

    ...
}

DbContext设置

modelBuilder.Entity<Product>()
            .HasMany(p => p.ChildSimilars)
            .WithMany(p => p.ParentSimilars)
            .Map(m =>
                     {
                         m.MapLeftKey("Product_Id");
                         m.MapRightKey("SimilarProduct_Id");
                    });

那基本上都是。