2016-12-22 3 views
0

ОБНОВЛЕНО: У меня есть фрагмент кода, который создает записи, когда они не существуют, или обновляет их, когда они существуют. Однако, при попытке обновить записи, которые я получаю это исключение:Ядро структуры Entity - DbUpdateException

Microsoft.EntityFrameworkCore.DbUpdateException УДАЛИТЬ заявление противоречия с ссылочного ограничением

public static string AddCurrencies(ApplicationDbContext db) 
{ 
    // ... 

    foreach (Currency c in db.Currency.ToList()) 
    { 
     try 
     { 
      db.Remove(c); // the troublemaker! 
      db.SaveChanges(); 
     } 
     catch 
     { 
      // probably in use (foreign key) 
     } 
    } 

    // ... 

    foreach (Currency c in CurrencyList) 
    { 
     var c_db = db.Currency.FirstOrDefault(x => x.Code == c.Code); 
     if (c_db == null) 
     { 
      // adding 
      db.Currency.Add(c); 
     } 
     else 
     { 
      // updating 
      c_db.Name = c.Name; 
      c_db.LocalDisplay = c.LocalDisplay; 
     } 
     db.SaveChanges(); // exception fired if updating! 
    } 

    // ... 
} 

После некоторого исследования, и имея возможность чтобы включить SQL-отладку, я обнаружил, что функция Remove() «сохраняется» и что она будет повторена во втором вызове SaveChanges(), поэтому исключение. Теперь вопрос переформулируется: как мне «отменить» (при отсутствии лучшего выражения) команды Remove(), которые не удалось?

+0

Является ли ключ валюты? [Исследуйте сгенерированный SQL] (https://msdn.microsoft.com/en-us/data/dn469464.aspx) для подсказок. –

+0

Нет, имя не является ключом. | db.Database.Log => Невозможно назначить «Журнал», потому что это «группа методов» – Marko

+0

Добавьте это до SaveChanges(): 'db.Database.Log = s => System.Diagnostics.Debug.WriteLine (s); 'затем посмотрите на вывод отладчика –

ответ

0

мне удалось решить эту проблему таким образом:

var entry = context.Entry(entity); 
entry.Reload(); 

для каждой записи, где удалось удалить.

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