当前位置: 首页 > 知识库问答 >
问题:

插入新实体而不创建子实体(如果存在)

姬昀
2023-03-14

我在代码优先的情况下使用EF,我有这样的模型:

public class Product
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public Customer Customer { get; set; }
}

public class Customer 
{
    public Customer ()
    {
        Products = new List<Product>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    // more stuff snipped...

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

我收到一个客户ID和一个产品ID列表。当产品在数据库中不存在时,我想添加它:

    var newProduct = new Product{ Id = id, Name = "<no name yet>", Customer = customer };
    InsertProduct(newProduct);

问题是EF试图级联更改并尝试插入一个新的Client对象,其ID与现有对象相同,因此失败。我如何解决这个问题?

这是插入方法:

    public void InsertProduct(Product item)
    {
        CustomerContext.Entry(item).State = EntityState.Added;
        CustomerContext.Set<Product>().Add(item);
    }

共有2个答案

亢琦
2023-03-14

如果向父类添加外键,则更容易:

public class Product
{
    ....

    public int CustomerId { get; set; }

    public Customer Customer { get; set; }
}

然后,如果要插入,请设置外键而不是navigation属性:

    var newProduct = new Product
       { 
          Id = id, 
          Name = "<no name yet>", 
          CustomerId = customer.Id 
       };
   InsertProduct(newProduct);

参考文献:

为什么实体框架将现有对象重新插入我的数据库?

用缺少的外键凑合

乜昆
2023-03-14

从这里拍摄。

添加具有现有子对象(数据库中存在的对象)的新实体时,如果EF未跟踪子对象,则将重新插入子对象。除非先手动附加子对象。

尝试以下操作来设置子对象状态:

public void InsertProduct(Product item)
{
    // Calling this code before the context is aware of the Child
    // objects will cause the context to attach the Child objects to the     
    // context and then set the state.
    // CustomerContext.Entry(childitem).State = EntityState.Unchanged
    CustomerContext.Entry(item.ChildObject).State = EntityState.Modified;

    CustomerContext.Entry(item).State = EntityState.Added;
    CustomerContext.Set<Product>().Add(item);
}
 类似资料:
  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来我将要处理的对象是在事务中更新其所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有

  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来,我将使用该对象来更新事务中的所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有更

  • 在使用hibernate和jpa的spring mvc项目中,我有一个实体和一个实体。每个可以有许多,但每个只能有一个。如何为现有的保存新的? 我读过很多关于这个的帖子。如果我试图保存新的,就会出现无法保存分离实体的错误。但如果我试图保存现有的,则不会保存该角色。我读了这篇帖子,建议将hibernate注释移动到getter,但当我这样做时,我会收到一个引用未知属性的hibernate映射错误。这

  • 我的父母子女单向关系如下: 我创建一个父实例,给它分配一个子列表,并尝试持久化它,它工作得很好。 当我试图通过子实体单独保存时,我看到insert查询试图将null插入子表中的列PARENT_ID,并导致 异常,同时保存独立于父表的子实体。我试图插入的子实体与已经存在的父实体相关。 在将关系定义为单向关系后,是否无法直接保存子实体?

  • 我正在尝试为实体创建一个域模型(聚合),该实体包含子实体,并且可以有父实体。我们有实体包。我们可以把包裹分成更小的包裹(儿童)。每个分开的包都有一个父包。域的哪个部分应该包含域逻辑:聚合还是域服务?e、 g.聚合包有一个方法 分包还是原包?解决这个问题的正确方法是什么? 我希望我的域模型被ddd(应用程序和基础设施)的其他部分保持干净和幂等

  • 有谁能推荐一种仅当数据库中不存在条目时才通过spring数据jpa(在集群环境中)在数据库表中执行插入的方法吗? 例如,以带有消息和email_address表的数据库为例。当发往“user@so.com”的新消息添加到消息表中时,将在email_address表中检查电子邮件“user@so.com”是否存在于email_address中,如果不存在,则将其添加到数据库中。之后,在消息实体上设置