[英]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時,它將保存產品的新名稱。 但是,我失去了原子性,因為“其他數據庫更新”將不會保存到數據庫中。 正確的方法是什么?
對於每個請求上下文總是一個問題。 在一個大型項目中,我也從每個請求的上下文開始,但是由於此類問題而逐漸將其刪除。
我建議您確定類似的情況,在這些情況下您可能需要在不調用SaveChanges的情況下寫入數據庫-如果所有情況都限於此日志服務,那么您應該在不依賴上下文的情況下重新實現它? 或者,您應該能夠指定一種使用其自身上下文創建日志服務的自定義方式(即,構造函數不僅僅注入一種)。
我不熟悉Structuremap語法,因此這是Autofac的一些功能,它們可以實現相同的功能...
builder.RegisterType<MyContext>().InstancePerRequest(); // As you have already
builder
.Register(c => new LogService(new MyContext())
.As<ILogService>().InstancePerRequest();
這將使用顯式創建的上下文構造LogService,而不是如果我正常注冊就將注入的每個請求實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.