ОБНОВЛЕНО: У меня есть фрагмент кода, который создает записи, когда они не существуют, или обновляет их, когда они существуют. Однако, при попытке обновить записи, которые я получаю это исключение:Ядро структуры 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(), которые не удалось?
Является ли ключ валюты? [Исследуйте сгенерированный SQL] (https://msdn.microsoft.com/en-us/data/dn469464.aspx) для подсказок. –
Нет, имя не является ключом. | db.Database.Log => Невозможно назначить «Журнал», потому что это «группа методов» – Marko
Добавьте это до SaveChanges(): 'db.Database.Log = s => System.Diagnostics.Debug.WriteLine (s); 'затем посмотрите на вывод отладчика –