簡體   English   中英

保存更改失敗后調用保存更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM