Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 回滚时实体框架InvalidOperationException_C#_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 回滚时实体框架InvalidOperationException

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) {

我正在将我的windows应用程序与nopcommerce集成。因此,当我从nopcommerce注册客户时,所有信息都应保存到我的windows应用程序的新表
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;
}