/ / “Não é possível adicionar uma entidade que já existe” ao excluir e recriar registro com LINQ - asp.net, linq, entity

“Não é possível adicionar uma entidade que já existe” ao excluir e recriar um registro com LINQ - asp.net, linq, entity

Ao tentar excluir um registro em um banco de dados e recriá-lo depois, usando o LINQ, recebo o erro: Não é possível adicionar uma entidade que já existe. Embora o registro seja excluído.

Estou inicializando meu objeto Sales_header com dados que recebo de uma consulta LINQ no método SelectOrdersByOrderID (OrderID).

Se o OrderID do Salesheader atender a uma determinadacondição, quero excluir o registro no banco de dados (Delete (Sales_header SalesHeader)), adicionar valores adicionais ao objeto e inserir um novo registro no banco de dados (Insert (Sales_header SalesHeader)).

Eu não quero atualizar o registro, mas excluí-lo e recriá-lo.

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

Método em SalesHeaderClass para selecionar o SalesHeader via 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;

Método em SalesHeaderClass para inserir o SalesHeader via LINQ

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

Método em SalesHeaderClass para excluir o SalesHeader via 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();
}

O que tenho que fazer para poder inserir o registro? Criar um novo objeto com os mesmos valores não ajuda.

Respostas:

0 para resposta № 1

Além da pergunta por que uma atualização não é adequada.

Você precisa de dois contextos para primeiro excluir o registro,e insira o registro. O EF mantém todas as inserções / atualizações / exclusões na memória até que você faça um SubmitChanges (), então você não pode ter duas entidades com o mesmo ID.

Mas para executar todas as coisas como uma única transação, você vai precisar de um 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 para resposta № 2

Para corrigir esse problema, use datacontext diferente para excluir e inserir operação.