DbUpdateConcurrencyException при использовании LocalDB - PullRequest
0 голосов
/ 03 мая 2018

Я использую 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; }
    }
}

1 Ответ

0 голосов
/ 04 мая 2018

Я "решил" это сам. Проблема была связана с тем, что каким-то образом все определения и индексы первичного ключа были потеряны при восстановлении. Поэтому я удалил базу данных LocalDB, создал новую резервную копию из рабочей базы данных и восстановил ее снова. Сейчас это работает.

...