代码之家  ›  专栏  ›  技术社区  ›  mu88

使用LocalDB时出现DbUpdateConcurrencyException

  •  0
  • mu88  · 技术社区  · 6 年前

    我正在使用ASP。NET Web API 2和实体框架6提供一些REST接口,将简单数据存储在SQL Server数据库中。对于本地开发,我使用LocalDB 2017,每次我想创建或更新对象时 DbUpdateConcurrencyException 调用时引发 SaveChanges() 。详细错误消息为:

    “System”类型的异常。数据实体基础设施EntityFramework中发生DbUpdateConcurrencyException“”。dll,但未在用户代码中处理
    其他信息:Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。

    删除对象时,此问题不适用。此外,在将相同的代码发布到暂存我们的生产环境时,不会出现这种情况,因为我使用的是SQL Server的完整版本。

    因为我发现一些帖子描述了使用 DateTime ,我已经检查过了。但是,即使尝试持久化不使用日期或时间的简单数据,也会出现问题。

    我还尝试从本地托管的Web 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 回复  |  直到 6 年前
        1
  •  0
  •   mu88    6 年前

    我自己“解决”了它。问题在于,在恢复过程中,所有主键定义和索引都以某种方式丢失了。因此,我删除了LocalDB数据库,从生产数据库中创建了一个新的备份,并再次将其还原到。现在它正在工作。