首页 > 解决方案 > 通用插入多对多(实体框架)

问题描述

我正在尝试使用按预期工作的通用方法插入一个新实体(产品)。该实体(产品)有另一个实体(供应商),当我尝试将同一产品与与之相关的新供应商(又名 Product.Suppliers.Add(NewSupplier))插入时,它会重新插入已经存在的产品(使用播种器方法)到数据库中...我知道它与供应商有关,因为当我不添加它并简单地插入产品并且不与同一供应商创建副本时。

以下是更多(简化)信息: 产品实体:

public class Product : BaseEntity
{
    public string ProductName { get; set; }

    public virtual ICollection<Supplier> Suppliers { get; set; }

    ... others
}

供应商实体:

 public class Supplier:BaseEntity
{

   public string SupplierName { get; set; }

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

    ... others
}

我有一个使用 Fluent API 的带有 SupplierId 和 ProductId 的 ProductSupplier 表。我仍然可以在这种情况下使用我的通用插入吗?如果可以,我做错了什么以及我做错了什么,为什么我从数据库获得的供应商被重新插入?

感谢大家的任何反馈!亲切的问候

更新: 我认为这是因为我在执行 CRUD 操作时将上下文封装在 using 语句中。我遇到了这篇文章

下周我会看看,因为我必须实现其他功能。同时随意添加你的 2cents :)

更新 2

这是我的通用插入方法:

  public static bool Insert<T>(T item) where T: class // here we specify that the <T> object is of type 'class'
    {
        using (ApplicationDbContext ctx = new ApplicationDbContext())
        {                
                ctx.Database.Log = (dbLog => logger.Debug(dbLog));

                ctx.Set<T>().Add(item);
                ctx.SaveChanges();
                return true;                              
        }
    }

标签: entity-frameworkduplicatesmany-to-manygeneric-programming

解决方案


我已经尝试了几种方法,但到目前为止只有一种方法有效,所以我将继续使用这个方法,但请随时发布您的(更好的)建议,以便我可以改进当前的解决方案。我所做的很简单,我很确定肯定还有其他方法,但目前还不知道。每当我创建新实体时,在进行任何插入/更新之前,我都会获取相关实体(如果它们存在)并将它们附加到要插入的实体上,如果它们不存在则可以,实体将为我插入它们。

希望这对任何人都有帮助。亲切的问候


推荐阅读