我有一個封裝的try/catch塊與EF的DbContexts結合的問題。爲DbContext使用塊的例外
我的代碼被認爲是在以下各項:
var hasToBeRepaired = false;
Exception ex = null;
try
{
SqlCeToSqLite(testContext);
}
catch(Exception exc)
{
hasToBeRepaired = true;
ex = exc;
}
if (hasToBeRepaired)
{
testContext.Dispose();
GC.Collect();
RepairComplete(_bl.BlShip.Imo, backupLastCe.BackUpPath);
}
在SqlCeToSqLite以下使用:
using(var emptydbcontext = new WriteObjectsContext(builder.ToString(), Providers.SqLite))
{
....
}
這基本上是從複製的TestContext表到新的上下文(emptydbcontext)。 當拋出異常時,我想從之前創建的備份中恢復,這是在RepairComplete()函數中完成的。這涉及到首先刪除數據路徑中的所有項目,然後從那裏移動備份中的項目。
但是,當我想刪除由emptydbcontext創建的數據庫時,它會拋出IOException「進程無法訪問文件'9622241.s3db',因爲它正在被另一個進程使用。」
這告訴我上下文仍然是打開的,儘管它應該在使用()塊的時候拋出異常嗎?收集垃圾清理任何被處置的物體並沒有幫助。 RepairComplete不會創建任何上下文,它只是刪除文件(在那裏崩潰),然後移動備份的文件。
爲什麼它不能這樣工作,當離開使用塊+通過GC時不應該處理上下文嗎?我能做些什麼來解決這個問題?