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 № 1A 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.