使用 LocalDB 时出现 DbUpdateConcurrencyException
DbUpdateConcurrencyException when using LocalDB
我正在使用 ASP.NET Web API 2 和 Entity Framework 6 提供一些 REST 接口,将简单数据存储在 SQL 服务器数据库中。对于本地开发,我使用的是 LocalDB 2017,每次我想创建或更新对象时,调用 SaveChanges()
时都会抛出 DbUpdateConcurrencyException
。详细的错误信息是:
An exception of type 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' occurred in EntityFramework.dll but was not handled in user code
Additional information: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded.
删除对象时不存在此问题。此外,在我使用 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; }
}
}
我"solved"我一个人。问题与这样一个事实有关,即所有主键定义和索引在恢复过程中都以某种方式丢失了。所以我删除了 LocalDB 数据库,从生产数据库创建了一个新备份并将其再次恢复。现在可以使用了。
我正在使用 ASP.NET Web API 2 和 Entity Framework 6 提供一些 REST 接口,将简单数据存储在 SQL 服务器数据库中。对于本地开发,我使用的是 LocalDB 2017,每次我想创建或更新对象时,调用 SaveChanges()
时都会抛出 DbUpdateConcurrencyException
。详细的错误信息是:
An exception of type 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' occurred in EntityFramework.dll but was not handled in user code
Additional information: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded.
删除对象时不存在此问题。此外,在我使用 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; }
}
}
我"solved"我一个人。问题与这样一个事实有关,即所有主键定义和索引在恢复过程中都以某种方式丢失了。所以我删除了 LocalDB 数据库,从生产数据库创建了一个新备份并将其再次恢复。现在可以使用了。