2013-06-04 158 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"); 
        }); 

那是,基本上所有。

相關問題