2016-03-21 3 views
0

проблем (см AbandonOrderTest3 в коде ниже):Entity дважды добавляются в базу данных

объект клиента и объект заказа является до обновленными.

Заказчик указан как собственность для заказа.

Заказ прилагается к контексту, однако SaveChanges не вызывается.

Контекст расположен.

Объект заказа обновляется снова, а объект клиента устанавливается как свойство.

Создан новый контекст и добавлен заказ. Вызывается SaveChanges.

Заказ добавляется дважды в базу данных (это проблема, она должна быть добавлена ​​один раз).

.Net версии: 4.5, версия EF: 6.1.3

public void AbandonOrderTest1() 
    { 
     // Works as expected 
     Customer c1 = new Customer { Name = "C1", ID = 9 }; // Customer with this ID already exists 
     Order order = new Order { Customer = c1, CustomerID = c1.ID }; 

     using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      db.Orders.Add(order); 
      db.Entry(order.Customer).State = EntityState.Detached; 
      db.SaveChanges(); 
     } 
    } 

    public void AbandonOrderTest2() 
    { 
     // Order is added once, customer is added again as expected 
     Customer c1 = new Customer { Name = "C1", ID = 9 }; // Customer with this ID already exists 
     Order order = new Order { Customer = c1, CustomerID = c1.ID }; 

     using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      db.Orders.Add(order); 
      // Save changes is not called here 
     } 

     // db is disposed at this point. Neither order nor c1 should be 
     // attached to any context as no context exists for them to be 
     // attached to. 


     using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      db.Orders.Add(order); 
      db.SaveChanges(); 
     } 
    } 

    public void AbandonOrderTest3() 
    { 
     // Order is added twice, customer is added again as expected 
     Customer c1 = new Customer { Name = "C1", ID = 9 }; // Customer with this ID already exists 
     Order order = new Order { Customer = c1, CustomerID = c1.ID }; 

     using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      db.Orders.Add(order); 
      // Save changes is not called here 
     } 

     // db is disposed at this point. Neither order nor c1 should be 
     // attached to any context as no context exists for them to be 
     // attached to. 

     // --- New up the order again 
     order = new Order { Customer = c1, CustomerID = c1.ID }; 

     using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      var orderState = db.Entry(order).State;   // Detached 
      var custState = db.Entry(order.Customer).State; // Detached 
      db.Orders.Add(order); 
      db.SaveChanges(); 
     } 
    } 

ответ

-1
using (Repository.db db = new Repository.db(_connectionString)) 
     { 
      db.Orders.Add(order); 
      // Save changes is not called here 
     } 

вы должны добавить ..

using (Repository.db db = new Repository.db(_connectionString)) 
      { 
       db.Orders.Add(order); 
       <php? cout << db.Orders.Add ?!> 

      } 
+1

спасибо за ваш ответ, однако я не думаю, что это относится к моему делу. Я использую .net/C# not php. Я добавил тег C# к моему вопросу (мой плохой). – Sam

0

Я написал статью об этой проблеме: Entity Framework - Entity Added twice in Database

На самом деле заказ не был добавлен дважды. Добавлен первый созданный заказ, тогда созданный второй порядок был добавлен в базу данных.

var customer = new Association_OneToMany_Left(); 
var order1 = new Association_OneToMany_Right(); 
var order2 = new Association_OneToMany_Right(); 

order1.Left = customer; 
order2.Left = customer; 

using (var ctx = new TestContext()) 
{ 
    // Adding the first order create a new order list in the customer entity 
    // customer.Right (The order list) contains now one element, the order1 
    ctx.Association_OneToMany_Rights.Add(order1); 

    // DO NOT save in the database. 
} 

using (var ctx = new TestContext()) 
{ 
    // customer.Right contains now two elements (order1 previously added and order2) 
    ctx.Association_OneToMany_Rights.Add(order2); 

    // Save left, order1 added from previous context and order2 added in this context 
    ctx.SaveChanges(); 
} 
+0

Благодарим вас за ответ. Поскольку нет второго порядка, я полагаю, вы имеете в виду, что EF рекламирует заказ для коллекции Customer.Orders, чтобы он не был удален? Я думаю, что ваша статья хороша, но делает больше, чтобы продемонстрировать проблему, чем решение. – Sam

+0

Если вы посмотрите на AbadonOrderTest3, вы создаете 2 порядка, даже если вы повторно используете одну и ту же переменную, поэтому первый и второй порядок. Добавьте точку останова перед вызовом «SaveChanges» и проверьте, что содержит Customer.Orders, и вы увидите 2 разных порядка и не только один. Для этого нет «решения», так как это не проблема, так это работает с Entity Framework. –

Смежные вопросы