gpt4 book ai didi

c# - Entity Framework 5 SaveChanges() 不回滚尝试的事务

转载 作者:行者123 更新时间:2023-11-30 16:18:34 25 4
gpt4 key购买 nike

我有以下代码(EntityContext.Current 是一个 DbContext):

try {
Setting s = new Setting
{
id = 1,
user_id = 0
};

EntityContext.Current.Settings.Add(s);
EntityContext.Current.SaveChanges(); //this violates a foreign key constraint and therefore throws an exception
} catch (Exception ex) {
ErrorContext.Log(ex);
}

我所期望的(根据 this answer )挂起的更改将在失败时回滚。但是,在我的错误记录方法中,我发现它们还没有出现。

Error e = new Error
{
message = ex.Message
};

EntityContext.Current.Errors.Add(e);

var pending = ((IObjectContextAdapter)EntityContext.Current).ObjectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added);
//this contains both my new error entity and my old setting entity which shouldn't be here

EntityContext.Current.SaveChanges();

当我的应用程序尝试在数据库中记录错误时,它还会尝试(再次)保存具有无效外键约束的设置,然后导致添加错误日志记录失败。

这是我第一次在 EF 中遇到这种行为。我尝试将第一个 SaveChanges() 包装在事务中,但出现了同样的问题。

根据 this answer我的连接字符串也不包含 Enlist=false。我不知所措。这是预期的行为吗?我怎样才能防止这种情况发生?

最佳答案

这是预期的行为。 SaveChanges 尝试在单个数据库事务中提交所有更改。如果失败,数据库事务将回滚,并且不会向数据库写入任何内容。

但是失败的事务不会改变上下文中实体的状态。这就是为什么您的 Setting 实体仍处于 Added 状态的原因。

将您的 Error 实体附加到相同的上下文是一个问题,因为您通常无法将它存储到数据库中,就像本例中那样。我会考虑始终在新上下文中使用专用方法编写错误日志,该方法仅打开新上下文,将 Error 实体添加到此上下文并保存更改。然后立即处理。

关于c# - Entity Framework 5 SaveChanges() 不回滚尝试的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com