我有以下代码(EntityContext.Current 是一个 DbContext):
当我的应用程序尝试在数据库中记录错误时,它还会尝试(再次)保存具有无效外键约束的设置,从而导致添加错误日志记录失败。 这是我第一次遇到EF的这种行为。我尝试将第一个
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);
}
根据此回答,我期望未提交的更改在失败时会被撤回。然而,在我的错误日志记录方法中,我看到它们没有被撤回。
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()
包装在事务中,但仍然出现了同样的问题。
根据这个答案,我的连接字符串也不包含Enlist=false
。我很困惑。这是预期的行为吗?我该如何防止这种情况发生?