2013-06-04 46 views
0

比如我有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); 
} 

空隙IProductRepository.AddProduct(产品产品);

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

,但我得到了奇怪的结果:以产品加入Product_Id场在我的数据库并没有如ProductProduct表或类似的东西存储相关产品的ID,如平常多了许多实体实现。我如何手动创建这个表格?我错过了什么或者错在哪里?

+1

看看这里http://stackoverflow.com/questions/5102930/how-to-do-many-to-many-with-the-same-table-with-ef4-code-first – Swell

+0

@Swell,谢谢你的建议。 – Dmytro

回答

0

感谢膨胀的意见,我已经想通了解决方案:

型号:

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

那是,基本上所有。

相关问题