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

void IProductRepository.AddProduct(产品产品);

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

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

4

1 回答 1

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

基本上,这就是全部。

于 2013-06-05T03:09:33.350 回答