插入时的实体框架DbUdateConcurrencyException

时间:2014-02-19 15:02:53

标签: c# entity-framework

从第三方API加载一些数据时,我从实体框架收到System.Data.Entity.Infrastructure.DbUpdateConcurrencyException并且没有插入任何记录:

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. Refresh ObjectStateManager entries.

以下是模型类的示例:

[Table("Events")]
public class StgEvent
{
    public Nullable<DateTime> WebServiceCallDate { get; set; }
    [Key]
    public int EventId { get; set; }
    [MaxLength(100)]
    public string Lookup { get; set; }
    [MaxLength(510)]
    public string Name { get; set; }
    public Nullable<DateTime> StartDate { get; set; }
    public Nullable<DateTime> EndDate { get; set; }
    [MaxLength(510)]
    public string Client { get; set; }
    [MaxLength(510)]
    public string VenueName { get; set; }
}

这是加载方法:

public override void LoadToSqlEF()
{
    using (var context = new DbContext(ConnectionString, SchemaName))
    {
        context.Events.AddRange(Events);

        context.SaveChanges();
    }
}

错误描述没有意义,因为只插入了数据。我没有在StackOverflow上看到任何类似的东西,所以我想我会发布我的问题和解决方案以防其他人有这个问题。

2 个答案:

答案 0 :(得分:0)

我通过运行sql profiler找出了什么问题,并注意到EventId值没有包含在insert语句中。因此,我意识到我需要将DatabaseGenerated(DatabaseGeneratedOption.None)属性添加到我的EventId:

[Table("Events")]
public class StgEvent
{
    public Nullable<DateTime> WebServiceCallDate { get; set; }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int EventId { get; set; }
    [MaxLength(100)]
    public string Lookup { get; set; }
    [MaxLength(510)]
    public string Name { get; set; }
    public Nullable<DateTime> StartDate { get; set; }
    public Nullable<DateTime> EndDate { get; set; }
    [MaxLength(510)]
    public string Client { get; set; }
    [MaxLength(510)]
    public string VenueName { get; set; }
}

添加属性后,问题就解决了。

答案 1 :(得分:0)

我遇到了同样的问题,但原因是数据上下文对象,其中包含以下行:

this.Entry(resource).State = EntityState.Modified;

这会将需要插入的数据上下文对象置于导致数据库拒绝更新的状态,因为它已被“修改”。

在保存代码之前,点击包含上述行的以下行:

if (resource.Id == Guid.Empty)
{
    this.Entry(resource).State = EntityState.Added;
    resource.Id = Guid.NewGuid();
    resource.Created = DateTime.UtcNow;
    resource.Modified = DateTime.UtcNow;
}
else
{
    this.Entry(resource).State = EntityState.Modified;
    resource.Modified = DateTime.UtcNow;
}

我通过过早地设置GUID并且代码的第一部分从未执行来引起它。即使在新的情况下,上下文也始终被“修改”,这导致了问题。