【问题标题】:"Cannot add an entity that already exists" while deleting and recreating record with LINQ使用 LINQ 删除和重新创建记录时“无法添加已存在的实体”
【发布时间】:2012-08-15 19:51:03
【问题描述】:

在尝试删除数据库中的记录并随后使用 LINQ 重新创建时,我收到错误:无法添加已存在的实体。 虽然记录被删除了。

我正在使用从方法中的 LINQ 查询中获得的数据初始化我的 Sales_header 对象 SelectOrdersByOrderID(OrderID).

如果Salesheader的OrderID满足某个条件,我想删除数据库中的记录(Delete(Sales_header SalesHeader)),给对象添加附加值,在数据库中插入一条新记录(Insert(Sales_header SalesHeader) ))。

我不想更新记录,但删除它并重新创建它。

Sales_header SalesHeader = new Sales_header();
SalesHeader = SalesHeaderClass.SelectOrdersByOrderID(OrderID) as Sales_header;


   if (SalesHeader.OrderID == *certain value*)
      {
       SalesHeaderClass.Delete(SalesHeader);
       SalesHeader.Orderdate = DateTime.Today;
       SalesHeader.Ordertime = DateTime.Now;
       SalesHeaderClass.Insert(SalesHeader);
      }
...

SalesHeaderClass 中通过 LINQ 选择 SalesHeader 的方法

public static object SelectOrdersByOrderID(int OrderID)
{
    var Query = (from p in dc.Sales_headers
                 where p.OrderID.Equals(OrderID)
                 select p).SingleOrDefault();
    return Query;

SalesHeaderClass 中通过 LINQ 插入 SalesHeader 的方法

public static void Insert(Sales_header SalesHeader)
      {
       dc.Sales_headers.InsertOnSubmit(SalesHeader);
       dc.SubmitChanges();
      }

SalesHeaderClass 中通过 LINQ 删除 SalesHeader 的方法

public static void Delete(Sales_header SalesHeader)
      {
       var DelOrder = (from p in dc.Sales_headers
                       where p.OrderID == SalesHeader.OrderID
                       select p).Single();
       dc.Sales_headers.DeleteOnSubmit(DelOrder);
       dc.SubmitChanges();
      }

我必须做什么才能插入记录? 创建具有相同值的新对象没有帮助。

【问题讨论】:

  • 您是否有理由避免记录更新?
  • 因为,在进一步的开发中,我想重用它来添加新的销售线和删除旧的销售线。更新还不够,因为可能会有新的销售线。

标签: asp.net linq entity


【解决方案1】:

除了为什么不适合更新的问题。

您需要两个上下文来首先删除记录,然后插入记录。 EF 将所有插入/更新/删除操作保留在内存中,直到您执行 SubmitChanges(),因此您不能有两个具有相同 ID 的实体。

但是要将整个事情作为单个事务执行,您将需要一个TransactionScope

using (var scope = new TransactionScope()) {
    using (var salesHeader SalesHeader = new Sales_header()) {
        // Delete record
        ...
        salesHeader.SubmitChanges();
    }
    using (var salesHeader SalesHeader = new Sales_header()) {
        // Insert record
        ...
        salesHeader.SubmitChanges();
    }

    // Mark transaction complete
    scope.Complete();
}

【讨论】:

  • 我已经尝试了两个上下文,但随后出现以下错误:尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。这是不支持的。将尝试 TransactionScope,谢谢。
  • 因为它确实是另一个上下文的对象,所以你需要附加它。
【解决方案2】:

要解决此问题,请使用不同的数据上下文进行删除和插入操作。

【讨论】:

  • 当我这样做时,我得到:尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。这不受支持。
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多