代码之家  ›  专栏  ›  技术社区  ›  Dimitri

无法将同一实体(具有不同相关属性的实体)插入到另一实体

  •  0
  • Dimitri  · 技术社区  · 5 年前

    收集供应商 合同实体 谁得了c 产品收集 2相同的产品,但供应商不同 .

    当我尝试将第二个产品添加到我的合同中时(相同的产品,但 不同的供应商 这一次)EF似乎忽略了它,没有将其添加到Contract.Products集合中。没有错误,但它不会添加错误。如何绕过此行为或以执行此操作的方式设置模型/逻辑?

    // THIS CONTEXT RESIDES IN A USING BLOCK
    // THE updateContracts.Products ARE COMING FROM ANOTHER CONTEXT and we are receiving this entity as a parameter
    
    // fetching the contract we are updating from database
    Contract contractFromDB = ctx.Contracts.Include(s)(...)Where(p => p.ID == updateContract.ID).FirstOrDefault();
    
    // list to populate the products we have added
    List<Product> productsToAddToDBContract = new List<Product>();
    
    foreach (Entity.Product product in updateContract.Products)
    {
      if (!contractFromDB.Products.Any(prod => prod.ProductName == product.ProductName))
      {
      // tried detaching it but didn't work
      //ctx.Entry(product).State = EntityState.Detached;
      productsToAddToDBContract.Add(product);
      }
    }
    
    foreach (Product product in productsToAddToDBContract)
    {
    // get these from DB and add those to DB contract products
    Product productToAdd = ctx.Products.Include(p=> p.Suppliers).Where(prod=> prod.ProductName == product.ProductName).FirstOrDefault();
      if (productToAdd != null)
      {
       // HERE IS WHERE EF DOESN'T ADD THE SECOND PRODUCT (WHICH IS THE SAME BUT FROM ANOTHER SUPPLIER)
       contractFromDB.Products.Add(productToAdd);
      }
    }
    

    非常感谢你。

    编辑: 我试图删除从数据库中提取产品的行

    Product productToAdd = ctx.Products.Include(...).Where(...).FirstOrDefault();
    

    只需使用我之前已经获取的产品,并将其与UpdateContact一起传递 “无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。”

    foreach (Product product in productsToAddToDBContract)
    {
      // removed this line:
      // Entity.Product productToAdd = ctx.Products.Include(p=> p.Suppliers).Where(prod=> prod.ProductName == product.ProductName).FirstOrDefault();
    
      // and added this one
      ctx.Products.Attach(product);
      contractFromDB.Products.Add(product);
    }
    

    然后我收到了‘” 附加“Supplier”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。 “请注意,产品已附加/包含供应商,但来自另一个上下文(与产品上下文相同)。

    我想这是关于产品和供应商的关系,或者可能是因为我使用了不同的上下文,我不知道,但我会进一步调查并发回。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Dimitri    5 年前

    问题是我的模型结构,我无法详细说明它是如何建立的,但相关实体关系没有正确设置,我创建了一个新实体,其中包含ProductId SupplierId和其他实体,并对其进行调整,直到得到我想要的。我之所以会出现这些错误(如上所述),是因为我在执行操作时没有附加所有相关实体,当我将适当的相关实体引用到我的产品时,错误消失了…:)

    希望这有助于人和原谅我的一些不明确的解决方案,我在这个项目的中期和时间是一个问题,因为知道公司希望一个工作解决方案,而不是一个干净的,所以我没有什么都不下来…

    亲切的问候!