c# - 使用 LocalDB 时出现 DbUpdateConcurrencyException
问题描述
我正在使用 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; }
}
}
解决方案
我自己“解决”了它。问题与在还原期间以某种方式丢失了所有主键定义和索引的事实有关。所以我删除了 LocalDB 数据库,从生产数据库创建了一个新的备份并再次将其恢复。现在它正在工作。
推荐阅读
- python - 使用 is_valid 属性检查 shapely.geometry.LinearRing 对象的有效状态、错误或我的误解?
- android - 如何在图片中的形状周围绘制轮廓?
- r - Dplyr 将数据从开始和停止级别重塑为每周级别
- java - 如何强制 Java Socket 的 InputStream 抛出 IOException?
- c - 使用 Gcc 将 C 函数名称导出到带有特殊字符的 DLL/SO
- html - HTML 在新选项卡按钮中打开链接
- php - Laravel - How to optimize identical loops in blade views
- node.js - Gaxios - NodeJS - Spreadsheet Google 上的此文档不支持此操作
- c# - “异步任务”与“返回 Task.Run”
- python - 截断 f 字符串浮点数而不四舍五入