/ / "Impossibile aggiungere un'entità che esiste già" durante l'eliminazione e la ricostruzione di record con LINQ - asp.net, linq, entità

"Impossibile aggiungere un'entità già esistente" durante l'eliminazione e la ricreazione di record con LINQ - asp.net, linq, entity

Durante il tentativo di eliminare un record in un database e ricrearlo in seguito, utilizzando LINQ, viene visualizzato l'errore: Impossibile aggiungere un'entità che esiste già. Sebbene il record sia stato eliminato.

Sto inizializzando il mio oggetto Sales_header con i dati che ottengo da una query LINQ nel metodo SelectOrdersByOrderID (OrderID).

Se l'ID ordine della Salesheader soddisfa un determinatocondizione, desidero eliminare il record nel database (Delete (Sales_header SalesHeader)), aggiungere ulteriori valori all'oggetto e inserire un nuovo record nel database (Insert (Sales_header SalesHeader)).

Non voglio aggiornare il record, ma eliminarlo e ricrearlo.

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

Metodo in SalesHeaderClass per selezionare SalesHeader tramite LINQ

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

Metodo in SalesHeaderClass per inserire SalesHeader tramite LINQ

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

Metodo in SalesHeaderClass per eliminare SalesHeader tramite LINQ

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

Cosa devo fare per poter inserire il record? La creazione di un nuovo oggetto con gli stessi valori non aiuta.

risposte:

0 per risposta № 1

A parte la domanda sul perché un aggiornamento non sia adatto.

Sono necessari due contesti per eliminare prima il record,e quindi inserire il record. EF mantiene tutti gli inserimenti / aggiornamenti / eliminazioni in memoria fino a quando non si esegue un SubmitChanges (), quindi non è possibile avere due entità con lo stesso ID.

Ma per eseguire tutte le cose come un'unica transazione, avrai bisogno di un 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();
}

0 per risposta № 2

Per risolvere questo problema, utilizzare diversi datacontext per l'operazione di eliminazione e inserimento.