SaveChanges 失败后调用 SaveChanges

Calling SaveChanges after SaveChanges fails

我有以下测试代码:

try
{
    Product product = productService.GetProductById(1502);
    product.ProductName = "TEST PRODUCT NAME";

    throw new ArgumentException("");

    //Do some other DB updates

    //Call SaveChanges
    productService.SaveChanges();
}   
catch(Exception ex)
{
    logService.InsertLog(LogTypeEnum.Error, "test", ex);
    logService.SaveChanges();
}

问题是我的服务在每个请求中共享一个上下文(使用 StructureMaps HttpContextScoped)。因此,当发生故障并且我调用 logService.SaveChanges 时,它会保存产品的新名称。但是我失去了原子性,因为 "other DB updates" 不会保存到数据库中。实现这个的正确方法是什么?

这始终是上下文问题 per-request。在一个大型项目中,我也从上下文 per-request 开始,但由于这样的问题逐渐将其删除。

我建议确定这样的场景,您可能需要在不调用 SaveChanges 的情况下写入您的数据库 - 如果它全部限于此日志服务,那么也许您应该 re-implement 这不依赖于上下文?或者,您应该能够指定一种使用自己的上下文创建日志服务的自定义方法(即不仅仅是构造函数注入一个)。

我不熟悉 Structuremap 语法,所以这里有一些来自 Autofac 的东西可以做同样的事情...

builder.RegisterType<MyContext>().InstancePerRequest();  // As you have already
builder
    .Register(c => new LogService(new MyContext())
    .As<ILogService>().InstancePerRequest();

这将使用显式创建的上下文而不是 per-request 如果我正常注册它就会被注入的实例来构造 LogService。