我正在使用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; }
}
}
答案 0 :(得分:0)
我自己“解决”了它。问题与以下事实有关:在恢复期间,所有主键定义和索引都以某种方式丢失。所以我删除了LocalDB数据库,从生产数据库创建了一个新的备份,并将其重新恢复。现在它正在发挥作用。