首页 > 解决方案 > 解决 Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException 的问题

问题描述

我在使用 Entity Framework Core 对表进行插入操作时遇到问题。

_context.Entry(item).State = EntityState.Added;
var r = await _context.ServiceWorkOrders.AddAsync(item);
_context.SaveChangesAsync(); <-- (fails)

处理此问题时的一些上下文。

我正在尝试直接使用存储过程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; }


}

标签: sql-serverasp.net-coreasp.net-web-apiconcurrencyentity-framework-core

解决方案


你确定你创建了ITEM吗?并指出你尝试保存行的表?

如果你想在表中插入行,你必须先创建你的项目。前:

var = new ServiceWorkOrders(){Column1=var1,Column2=var2 etc.};
await _context.ServiceWorkOrders.AddAsync<ServiceWorkOrders>(item);
await _context.SaveChangesAsync();

推荐阅读