Я использую ASP.NET Web API 2 и Entity Framework 6 для предоставления некоторых интерфейсов REST, хранящих простые данные в базе данных SQL Server. Для локальной разработки я использую LocalDB 2017, и каждый раз, когда я хочу создать или обновить объект, при вызове SaveChanges()
выдается DbUpdateConcurrencyException
. Подробное сообщение об ошибке:
Исключение типа 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' произошло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительная информация: оператор обновления, вставки или удаления магазина затронул неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов.
Эта проблема не применяется при удалении объектов. Более того, этого не происходит при публикации того же кода в готовой производственной среде, где я использую полноценную версию SQL Server.
Поскольку я нашел несколько постов, описывающих проблемы при использовании DateTime
, я уже это проверил. Но даже при попытке сохранить простые данные, которые не используют дату или время, проблема возникает.
Я также попытался получить доступ к промежуточной базе данных из моего локально размещенного веб-API, и это сработало без проблем. Так что я думаю, что это связано с базой данных этого конкретного разработчика.
Любые идеи, почему это исключение возникает только с LocalDB и что я могу сделать, чтобы избежать?
Вот пример кода:
namespace ConsoleApplication1
{
using System;
class Program
{
static void Main(string[] args)
{
using (var model = new MyDbModel())
{
var objectToCreate = new ApplicationError
{
Date = DateTime.Now,
Username = "mu88",
Exception = "<Exception>Something went wrong</Exception>"
};
model.ApplicationError.Add(objectToCreate);
model.SaveChanges();
}
}
}
}
namespace ConsoleApplication1
{
using System.Data.Entity;
public class MyDbModel : DbContext
{
public MyDbModel()
: base("name=MyDbModel")
{
}
public virtual IDbSet<ApplicationError> ApplicationError { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationError>().Property(e => e.Username).IsUnicode(false);
}
}
}
namespace ConsoleApplication1
{
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("tblApplicationError")]
public class ApplicationError
{
[Key]
public int ErrorId { get; set; }
[Column(TypeName = "xml")]
public string Exception { get; set; }
[StringLength(50)]
public string Username { get; set; }
public DateTime? Date { get; set; }
}
}