我使用實體框架4創建了一個非常簡單的數據庫。我希望能夠在實體上使用事務,但似乎無法保持回滾的更改。我真的只需要一種方法來在實體保存到數據庫之前放棄對實體的臨時更改。如何使用實體框架對象上下文執行事務?
例如,以下代碼使用實體框架對象上下文「MusicContainer」。在TransactionScope中,創建一個Artist實體。交易結束後沒有完成;所以我期望事務被回滾。但是,程序運行起來就好像我從未創建過TransactionScope;在TransactionScope結束之後,線路music.SaveChanges()將對象保存到數據庫。
class Program
{
static void Main(string[] args)
{
using (MusicContainer music = new MusicContainer())
{
using (TransactionScope transaction = new TransactionScope())
{
Artist artist = new Artist { Name = "Test" };
music.Artists.AddObject(artist);
}
// The transaction ended without Complete(); shouldn't the changes be abandoned?
music.SaveChanges();
}
}
}
如果實體框架不使用的TransactionScope,我期待它給來這裏的路上,我怎麼能得到我要找的功能?我有幾種情況,一個函數的調用者在MusicContainer中傳入,並且在我從函數返回之前,我需要將MusicContainer保持在一個乾淨的狀態(即回滾更改,以便它們不會意外地被另一個SaveChanges調用在同一個MusicContainer對象上)。
您是否建議我爲每筆交易使用單獨的「使用(MusicContainer music = new MusicContainer())」?我的第一個懷疑是,如果我有幾十個並行發生的話,這將是一個瓶頸 - 我錯了嗎? – 2011-03-07 17:22:57
@notfed我相信開銷很小 - 數據庫連接僅在需要時由EF使用,即調用'SaveChanges()'或執行查詢時,還可以查看此MSDN文章:http://msdn.microsoft.com/ en-us/library/cc853327.aspx – BrokenGlass 2011-03-07 17:42:44
@notfed:您必須爲每個事務使用新的容器。閱讀這裏:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 – 2011-03-07 18:00:13