2

データベース内のレコードを削除して後で再作成しようとすると、LINQを使用して、次のエラーが発生します。既存のエンティティを追加できません。 レコードは削除されますが。

SelectOrdersByOrderID(OrderID)メソッドのLINQクエリから取得したデータを使用してSales_headerオブジェクトを初期化しています 。

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);
      }
...

LINQを介してSalesHeaderを選択するSalesHeaderClassのメソッド

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

LINQを介してSalesHeaderを挿入するSalesHeaderClassのメソッド

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

LINQを介してSalesHeaderを削除するSalesHeaderClassのメソッド

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();
      }

レコードを挿入できるようにするにはどうすればよいですか?同じ値で新しいオブジェクトを作成しても役に立ちません。

4

2 に答える 2

0

この問題を解決するには、削除操作と挿入操作に異なるデータ コンテキストを使用します。

于 2012-09-05T07:35:11.917 に答える
0

なぜ更新が適切でないのかという質問は別として。

最初にレコードを削除してからレコードを挿入するには、2 つのコンテキストが必要です。EF は、SubmitChanges() を実行するまですべての挿入/更新/削除をメモリに保持するため、同じ ID を持つ 2 つのエンティティを持つことはできません。

しかし、すべてを単一のトランザクションとして実行するには、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();
}
于 2012-08-20T13:29:23.400 に答える