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。
我有以下测试代码:
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。