使用LocalDB

时间:2018-05-03 08:31:49

标签: c# entity-framework asp.net-web-api localdb

我正在使用ASP.NET Web API 2和Entity Framework 6来提供一些REST接口,用于在SQL Server数据库中存储简单数据。对于本地开发,我使用的是LocalDB 2017,每次我想创建或更新对象时,调用DbUpdateConcurrencyException时都会抛出SaveChanges()。详细的错误消息是:

  

EntityFramework.dll中出现“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常,但未在用户代码中处理
  附加信息:存储更新,插入或删除语句会影响意外的行数(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 个答案:

答案 0 :(得分:0)

我自己“解决”了它。问题与以下事实有关:在恢复期间,所有主键定义和索引都以某种方式丢失。所以我删除了LocalDB数据库,从生产数据库创建了一个新的备份,并将其重新恢复。现在它正在发挥作用。