從Documentation我應該如何管理MVC Core中的DbContext生命週期?
實體框架上下文應該被添加到使用
Scoped
終身服務容器 。如果您使用如上所示的幫助程序方法,則會自動執行此操作。使用實體框架 的存儲庫應該使用相同的生命週期。
我一直認爲,我應該爲每一個單位的工作單位創造一個新的環境,我必須處理。這讓我想,如果我有一個ServiceA
和ServiceB
,它們在DbContext
上應用不同的操作,它們應得到不同的實例DbContext
。
的documentation讀取如下:
Transient
對象總是不同;爲每個控制器和每個服務提供一個新實例。
Scoped
對象是請求中的相同,但不同的跨越不同的要求
再回到ServiceA
和ServiceB
,它的聲音對我來說,Transient
更適合。
我研究過,上下文應該只保存一次HttpRequest,但我真的不明白這是如何工作的。
特別是具有如果我們看一看一個服務:
using (var transaction = dbContext.Database.BeginTransaction())
{
//Create some entity
var someEntity = new SomeEntity();
dbContext.SomeEntity.Add(someEntity);
//Save in order to get the the id of the entity
dbContext.SaveChanges();
//Create related entity
var relatedEntity = new RelatedEntity
{
SomeEntityId = someEntity.Id
};
dbContext.RelatedEntity.Add(relatedEntity)
dbContext.SaveChanges();
transaction.Commit();
}
在這裏我們需要保存的背景下,爲了得到這是關係到我們剛剛創造了一個又一個實體的ID。
同時,另一項服務可能會更新相同的上下文。從我讀到的,DbContext
不是線程安全的。
在這種情況下,我應該使用Transient
嗎?爲什麼文檔提示,我應該使用Scoped
?
我錯過框架的一些重要部分嗎?
切勿使用臨時'DbContext'註冊。瞬態生命週期將創建一個服務的新實例**每個**它是另一個服務請求的時間。這將導致每個請求有多個'DbContext's。在同一請求中重複使用相同的'DbContext'實例沒有問題:每個請求都綁定到單個線程,所以根本沒有線程安全問題。 –
但是如果服務因爲某種原因(例如Task.Start)並行處理會發生什麼? @FedericoDipuma –
你的意思是*並行*?你是否明確地產生了一個新的線程,你可以使用相同的'DbContext'? –