2011-03-14 70 views
1

我想讓你瞭解這個問題點:建議對於實體框架數據訪問層

我寫的使用實體框架和通用classes.because使用C#中的交易數據訪問層是不太最佳實踐: Issue with System.Transactions,SqlConnection and Timeout

我想使用Linq To Entities編寫我的select語句,但是在存儲過程中(因爲它必須處於與其他語句的事務中)的其他語句,比如「INSERT,DELETE,UPDATE,...」在數據訪問層。

好嗎?它與分層不一致嗎?任何人都可以演示一些文章嗎?

非常感謝

回答

2

您可以使用實體框架編寫整個數據訪問層。對於交易,您可以使用EF上下文。如果有單個數據庫,這將自動爲您管理交易。

using(var context = new YourDataContext()) 
{ 
    //use context for CRUD operation 
    Entity1 entity1 = context.Entities1.Where(e1 => e1.Id == 1); 
    entity1.Prop1 = "New Value"; 

    context.Entities2.Add(entity2) 

    context.SaveChanges(); 
} 

是否有任何理由不想使用EF插入/更新/刪除?

+0

是因爲如果我有更新stetement使用INSERT語句這兩個語句不執行作爲事務 – Arian 2011-03-14 21:28:13

+0

@Nima:請看看我的更新。您可以在上下文中一起執行更新/插入。 – Amitabh 2011-03-14 21:42:03

+0

+1 @Amitabh是正確的,更新和插入如圖所示將在事務中運行 - 'context.SaveChanges()'在內部使用事務 - 只需要'TransactionScope'等等,如果您需要跨越多個事務數據庫上下文或包含其他資源。 – BrokenGlass 2011-03-14 21:48:06

1

我想寫使用LINQ to在存儲 過程實體,但其他 的語句,如 「INSERT,DELETE,UPDATE,...」(我的select語句 ,因爲它必須在 交易與一些其他 語句)並在數據 訪問層中調用它們。

您可以使用TransactionScope與EF一起使用。這將允許您在EF的頂部添加將被兌現的交易(環境交易)。

using (TransactionScope transaction = new TransactionScope()) 
{ 
    //your EF query here 
    using(var context = new EFContext()) 
    { } 
} 
+0

恐怕也許TransactionScope有這樣的錯誤:http://weblogs.asp.net/ryangaraygay/archive/2008/04/14/issue-with-system-transactions-sqlconnection-and-timeout.aspx我的系統有很多交易必須是交易 – Arian 2011-03-14 21:31:35

+0

@Nima:我以前使用過TransactionScope,但沒有發現任何錯誤。我想你可以放棄它。 – Amitabh 2011-03-14 21:54:09

0

您可以使用function imports執行存儲過程。那麼您可以明顯地將所有的事務邏輯包含在這些存儲過程中。我喜歡實體框架,但也有一些和你一樣的擔憂。函數導入是我完成大部分事務處理和複雜邏輯的方式。

你的代碼看起來像這樣(以簡化的方式)......

using (var context = new YourContext()) 
{ 
    context.ExecuteProcToRunTransaction("parameter 1", "parameter 2"); 
}