【问题标题】:Entity Framework Generic insert method is inserting already existing entity again along with the new entity实体框架通用插入方法将已存在的实体与新实体一起再次插入
【发布时间】:2019-04-17 05:16:20
【问题描述】:

我有以下插入方法:

  public static bool Insert<T>(T item) where T : class 
    {
        using (ApplicationDbContext ctx = new ApplicationDbContext())
        {
            try
            {
                ctx.Set<T>().Add(item);
                ctx.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
               // ...
            }
        }
    }

这按预期工作,但是当我想插入一个与现有实体有关系的新实体时,EF 将再次插入这个关系(已经存在的)实体以及新实体。

详情: 我的数据库中已经存在一个实体 Supplier。 我想插入一个新实体 Product ,它具有这个现有的供应商实体作为关系,所以我从数据库中检索这个供应商并将它添加到这个产品实体。当我使用通用方法插入它时,它会重新插入这个供应商,显然我不想要这种行为。

我在这里做错了什么还是设计使然,当将关系实体附加到我的新实体时,我不应该使用通用插入函数吗?

感谢您的任何建议或信息! 亲切的问候

编辑:

产品实体:

// ... non relational properties

public ICollection<Price> Prices { get; set; }
public ICollection<Supplier> Suppliers { get; set; }
public ICollection<Productnumber> ProductNumbers { get; set; }

价格实体:

public Product Product { get; set; }
public Supplier Supplier { get; set; }

供应商实体:

public ICollection<Productnumber> ProductNumbers { get; set; }
public ICollection<Product> Products { get; set; }
public ICollection<Price> Prices { get; set; }

ProductNumber 实体:

 public Supplier Supplier { get; set; }
 public Product Product { get; set; }

我应该如何继续插入新产品?这可能具有这种结构并使用通用插入吗?

【问题讨论】:

    标签: c# entity-framework insert duplicates relational-database


    【解决方案1】:

    如果您想向现有的供应商添加新产品,您需要执行以下操作:

    1- 检索供应商实体,我们称之为sup

    2- 将新的产品添加到其中,

    sup.Product = new Product{properties
        ...}
    

    3- 更新 supplier 实体,

    ctx.Entry(sup).State = EntityState.Modified;
    ctx.SaveChanges();
    

    您每次使用 bool Insert&lt;T&gt; method 时都会添加一个新的供应商实体,这就是为什么您会出现意外行为,因此只需更新现有条目即可。

    希望这会有所帮助,

    【讨论】:

    • 天哪,这是有道理的。但话又说回来,如果我的产品有 2 个关系实体(比如说供应商和合同)。这仍然有效,并且不插入重复的合同吗?通过更新供应商来插入新产品似乎很奇怪:)稍后会尝试并发布我的反馈。感谢您的建议@Karoui Haithem!
    • 是的,确实,它以这种方式工作并且它充满意义,如果你想将 newEntityA 链接到 ExistingEntityB 你检索 B 并创建一个相关的 A 然后更新 B,如果你有 A与 B 到 C 相关...
    • 所以我已经完成了你所描述的,在创建新产品时,我从数据库中检索供应商(在 UI 中选择附加到这个新产品)。我将属性等分配给我的新产品,然后将此新产品添加到 Suppliers.Products 列表属性并保存。这确实创建了我的新产品实体,但仍在复制我的供应商......也许是另一个关系实体导致了这个?我将使用我的实体详细信息更新我的 OP。(到目前为止谢谢!)
    • 输入你刚才描述的代码,我不确定,但我认为你错过了更新实体 (ctx.Entry(yourEntity).State = EntityState.Modified;)
    • 您可以在新问题中发布您的最后一条评论并将其链接到此处,然后我将发布一个答案,展示如何使用 IRepository 模式和泛型来处理基本的 CRUD 操作与 EF
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多