C# 回滚时实体框架InvalidOperationException
我正在将我的windows应用程序与nopcommerce集成。因此,当我从nopcommerce注册客户时,所有信息都应保存到我的windows应用程序的新表C# 回滚时实体框架InvalidOperationException,c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,我正在将我的windows应用程序与nopcommerce集成。因此,当我从nopcommerce注册客户时,所有信息都应保存到我的windows应用程序的新表customer。为此,我在表generictAttribute上插入后创建了触发器 但当我要注册客户时,以下模式中的EfRepository.cs出现错误: protected string GetFullErrorTextAndRollbackEntityChanges(DbUpdateException exception) {
customer
。为此,我在表generictAttribute
上插入后创建了触发器
但当我要注册客户时,以下模式中的EfRepository.cs
出现错误:
protected string GetFullErrorTextAndRollbackEntityChanges(DbUpdateException exception)
{
//rollback entity changes
if (_context is DbContext dbContext)
{
var entries = dbContext.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList();
entries.ForEach(entry => entry.State = EntityState.Unchanged); //here error occurs
}
_context.SaveChanges();
return exception.ToString();
}
错误是:
invalidoOperationException
:实体类型上的属性“Id
”
“GenericAttribute
”在尝试更改属性时具有临时值
实体的状态为“未更改”
”。显式设置永久值或
确保数据库配置为生成此属性的值
当我有唯一索引时,我得到了相同的异常,AddRange在唯一索引上失败,然后在catch异常块中尝试删除整个插入的集合。 (不是我的代码,但我必须修复它:-)) 代码示例(简化):
试试看{
context.AddRange(users);//列表,具有属性列表
context.SaveChanges();//在唯一索引上引发异常
}捕获(例外情况除外){
context.RemoveRange(users);//这会引发异常“实体类型“Contact”上的属性“UserID”具有临时值”
投掷;
}
我认为你正试图以不同的方式(从内部)做同样的事情。只需使用事务,而不是黑客攻击EF。我怀疑问题在于您将添加和修改的实体放在一起,并试图恢复更改。由于尚未将新添加的条目提交到数据库,因此对其调用
EntityState.Unchanged
会使上下文认为它应该已经存在,但验证失败,因为Id
没有值。我会删除任何新创建的实体。
try {
context.AddRange(users); // List<User>, has property List<Contact>
context.SaveChanges(); // throws exception on unique index
} catch (Exception ex) {
context.RemoveRange(users); // this throws exception "The property 'UserID' on entity type 'Contact' has a temporary value"
throw;
}