首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SaveChanges失败后调用SaveChanges

在SaveChanges失败后调用SaveChanges
EN

Stack Overflow用户
提问于 2016-01-12 06:27:56
回答 1查看 114关注 0票数 1

我有以下测试代码:

代码语言:javascript
复制
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 --它保存了产品的新名称。但是,我失去了原子性,因为“其他DB更新”不会保存到DB中。实现这一点的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-12 08:31:33

这总是每个请求的上下文都会出现问题。在一个大型项目中,我也是从每个请求的上下文开始的,但是由于这样的问题,我已经逐渐删除了它。

我建议在这样的场景中,您可能需要在不调用SaveChanges的情况下写到您的DB --如果所有这些都局限于这个日志服务,那么也许您应该在不依赖上下文的情况下重新实现它?或者,您应该能够指定使用自己的上下文创建日志服务的自定义方法(即不只是构造函数注入一个日志服务)。

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

代码语言:javascript
复制
builder.RegisterType<MyContext>().InstancePerRequest();  // As you have already
builder
    .Register(c => new LogService(new MyContext())
    .As<ILogService>().InstancePerRequest();

这将使用显式创建的上下文来构造LogService,而不是使用如果我正常注册就会注入的每个请求实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34736924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档