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 № 1Alé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.