sql-server - 解决 Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException 的问题
问题描述
我在使用 Entity Framework Core 对表进行插入操作时遇到问题。
_context.Entry(item).State = EntityState.Added;
var r = await _context.ServiceWorkOrders.AddAsync(item);
_context.SaveChangesAsync(); <-- (fails)
处理此问题时的一些上下文。
- 该表归客户所有,因此我必须解决此问题
- 要插入的表包含设置为在插入/更新/删除操作后运行的触发器和存储过程。
- 该表具有关系属性(外键)
- 表的主键设置为自动递增,因此插入实体的主键字段设置为 0,以及此插入期间所需的字段。
我正在尝试直接使用存储过程ExecuteSqlCommand
,但我更愿意使用 EF 来管理数据库访问。此外,如果我错了,请纠正我,我必须在存储过程中列出所有可选参数,以便添加实体以防止写入错误的字段。目前此方法插入实体,但它写入错误的字段,即使我使用 SqlParameters("@named_field", value)。
我也尝试过使用同步方法,但它给出了同样的异常。
返回的异常:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:'数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=527962 。
编辑:
这是实体模型:
[Table("ASM_ServiceWorkOrder")]
public class ServiceWorkOrder: BaseEntity
{
[Key, Column(name: "ROWUID"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RowUID { get; set; }
[Column(TypeName = "nvarchar(25)")]
public string CompanyID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string DocNumber { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string RevisionNumber { get; set; }
[Column(TypeName = "nvarchar(40)")]
public string CustomerDirectoryID { get; set; }
[ForeignKey("CustomerLocation")]
public Int32? CustomerLocationRowUID { get; set; }
public AssetLocation CustomerLocation { get; set; }
[Column(TypeName = "nvarchar(50)")]
public string WorkOrderType { get; set; }
[Column(TypeName = "nvarchar(25)")]
public string IssueType { get; set; }
[Column(TypeName = "nvarchar(40)")]
public string AssetItemCode { get; set; }
[Column(TypeName = "nvarchar(40)")]
public string AssetSerialNo { get; set; }
[ForeignKey("AssetRegister")]
public int? AssetRegisterROWUID { get; set; }
public AssetRegister AssetRegister { get; set; }
[Column(TypeName = "nvarchar(40)")]
public string ProjectDirectoryID { get; set; }
[Column(TypeName = "nvarchar(10)")]
public string Priority { get; set; }
[Column(TypeName = "nvarchar(25)")]
public string Status { get; set; }
[Column(TypeName = "nvarchar(25)")]
public string StatusForClient { get; set; }
public bool? Billable { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal? QuotedFee { get; set; }
[Column(TypeName = "datetime")]
public DateTime? DueDate { get; set; }
[Column(TypeName = "nvarchar(240)")]
public string Description { get; set; }
[Column(TypeName = "nvarchar(50)")]
public string ReportedBy { get; set; }
[Column(TypeName = "datetime")]
public DateTime? ReportedDate { get; set; }
[Column(TypeName = "nvarchar(35)")]
public string BusinessDataType { get; set; }
[Column(TypeName = "nvarchar(240)")]
public string DocRemarks { get; set; }
[Column(TypeName = "nvarchar(2000)")]
public string ErrorText { get; set; }
public Guid? RowGlobalUID { get; set; }
public Int32? HeaderROWUID { get; set; }
[Column(TypeName = "datetime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime? DateOfDocument { get; set; }
//[Timestamp]
//public byte RowVersion { get; set; }
//public IList<ServiceWorkOrderAttachment> Attachments { get; set; }
public IList<ServiceWorkOrderDetails> Details { get; set; }
}
解决方案
你确定你创建了ITEM吗?并指出你尝试保存行的表?
如果你想在表中插入行,你必须先创建你的项目。前:
var = new ServiceWorkOrders(){Column1=var1,Column2=var2 etc.};
await _context.ServiceWorkOrders.AddAsync<ServiceWorkOrders>(item);
await _context.SaveChangesAsync();
推荐阅读
- javascript - Android后台可恢复上传失败 - React Native
- python - 如何在geopandas中将点与多边形连接起来
- python - 重新定义对象的方法
- image-processing - 尝试使用 Jupyter 运行代码,但抛出错误“导入名称批量标准化”
- css - 减 OR 运算符
- git - 防止 Git 快进自动合并
- linux - 我正在尝试使用命令在centos上安装jenkins - “sudo yum install jenkins -y”
- python-3.x - if 语句是否应该在断言值的函数中以 else 结尾
- .net - 如何使用 StorageManagementClient 的客户端密码在服务/守护程序应用程序中获取 MSAL 令牌?
- jenkins - 在创建 Jenkins 从属 - kubernetes 插件时,集群应优先于节点标签