从第三方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上看到任何类似的东西,所以我想我会发布我的问题和解决方案以防其他人有这个问题。
答案 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并且代码的第一部分从未执行来引起它。即使在新的情况下,上下文也始终被“修改”,这导致了问题。