gpt4 book ai didi

c# - 添加时出现 DbUpdateConcurrencyException

转载 作者:行者123 更新时间:2023-11-30 15:17:28 27 4
gpt4 key购买 nike

我在通过 DbContext.Add(...) 方法添加新实体时遇到问题。在 DbContext.SaveChanges() 上,我得到一个 DbUpdateConcurrencyException。我正在尝试插入数据库。我是该应用程序的唯一开发人员,运行本地主机,并且数据库表是原始的。没有用户。只有我。

这没有帮助,尽管它很相似:
Entity Framework 6 DbUpdateConcurrencyException When Adding New Rows To Database

我为每个请求使用一个 DbContext。像这样:
One DbContext per request in ASP.NET MVC (without IOC container)

我正在注销由 Entity Framework 生成的 sql 语句,如下所示:
https://stackoverflow.com/a/20751723/2088914

这是模型(代码优先,带有迁移)。当我发布时,我只提供关联、角色、分配者和已删除标志。行 ID 自动设置为 0,因为我没有从客户端提供它,日期也是默认值,然后我在服务器上填充它——所有预期的东西:

public class Permission {

[Column("row_id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RowId { get; set; }

[Key]
[StringLength(10)]
[Column("associate_nt_id", Order = 0)]
[Required]
public string AssociateNtId { get; set; }

[Key]
[Column("role_name", Order = 1)]
[StringLength(50)]
[Required]
public string RoleName { get; set; }

[Key]
[Column("eff_ts", Order = 2)]
[Required]
public DateTime EffectiveTimestamp { get; set; }

[StringLength(10)]
[Column("assignor_nt_id")]
[Required]
public string RoleAssignorNtId { get; set; }

[Column("deleted")]
[Required]
public bool Deleted { get; set; }

}

我有一个带有 post 方法的 web api Controller ,它被一个 angular spa 成功访问,并且模型被填充:

[HttpPost]
[Route("")]
[Require(Roles.admin)]
public Permission Post(Permission permission) {
permission.EffectiveTimestamp = DateTime.Now;
MAPDB.Current.Permissions.Add(permission);
MAPDB.Current.Database.Log = s => {
Debug.WriteLine(s);
};
MAPDB.Current.SaveChanges();
return permission;
}

我在 visual studio 2015 中调试运行。这是错误消息:
enter image description here

这是 Entity Framework 生成的 sql:

INSERT [dbo].[_permissions]([associate_nt_id], [role_name], [eff_ts], [assignor_nt_id], [deleted]) 
VALUES (@0, @1, @2, @3, @4)
SELECT [row_id]
FROM [dbo].[_permissions]
WHERE @@ROWCOUNT > 0 AND [associate_nt_id] = @0 AND [role_name] = @1 AND [eff_ts] = @2
-- @0: 'associate' (Type = String, Size = 10)
-- @1: 'user' (Type = String, Size = 50)
-- @2: '9/20/2017 12:49:05 PM' (Type = DateTime2)
-- @3: 'assignor' (Type = String, Size = 10)
-- @4: 'True' (Type = Boolean)
-- Executing at 9/20/2017 12:49:05 PM -05:00
-- Completed in 24 ms with result: SqlDataReade
-- Closed connection at 9/20/2017 12:49:05 PM -05:00

它似乎是在记录器中执行的,并且该语句正是我所期望的,只是没有发生数据库插入。如果我从记录器中取出语句,填写参数,并通过 sql 客户端执行它,它会工作并返回所创建内容的行 ID。我不明白问题出在哪里 - 没有发生并发情况,没有在不应该的情况下丢失/添加列,没有无效参数,将列映射到对象属性没有问题,没有 key 违规,标识列没有问题.

我怎样才能让 Entity Framework 只插入这个新对象(不吞下异常)?

感谢您的帮助。

最佳答案

问题很可能是由 PK (EffectiveTimestamp) 的 DateTime 部分引起的。记录已插入,但 SELECT 未找到它,因为默认情况下 EF 将 DateTime 属性映射到 datetime列,而从日志中可以看出,参数类型是datetime2 ,具有更高的精度,因此在存储到表列时会被截断,因此与选择过滤器的 [eff_ts] = @2 部分不匹配。

要查看是否是这种情况,您可以尝试修剪时间值:

// ...
var time = DateTime.Now;
permission.EffectiveTimestamp = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second);
// ...

如果可行(如我所料),您可以考虑更改数据库列类型:

[Key]
[Column("eff_ts", Order = 2, TypeName="datetime2")]
[Required]
public DateTime EffectiveTimestamp { get; set; }

关于c# - 添加时出现 DbUpdateConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46329094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com