2011-11-23 34 views
1

我使用Code First Entity Framework來完成我所有的數據庫檢索。不幸的是,在我工作的地方,他們強制要求使用存儲過程來完成任何更新/插入/刪除操作。使用存儲過程混合實體框架 - 連接問題

我開始通過執行以下操作:

public partial class MyContext 
{ 
    public void AddStatus(int id, string status) 
    { 
     var connection = (SqlConnection)this.Database.Connection; 

     if(connection.State != ConnectionState.Open) 
      connection.Open(); 

     SqlCommand cmd = connection.CreateCommand(); 
     // ... 

     cmd.ExecuteNonQuery(); 
    } 
} 

這一段時間工作的罰款,直到我碰到地方,我需要這個代碼後直接檢索從我的數據庫中的數據,使用相同的上下文情景傳來:

MyContext db = new MyContext(); 

db.AddStatus(1, "Open"); 

var item = db.Items.Find(1); 

我得到了以下錯誤:

ArgumentException - EntityConnection can only be constructed with a closed DbConnection.

有什麼辦法可以混合這樣的代碼,還是我必須創建另一個連接到我的數據庫?如果我創建一個新的連接,如分佈式事務,如果我需要一個事務範圍,我會遇到問題嗎?

+3

爲什麼不只是使用內置的proc映射機制? – BNL

+0

什麼是proc映射?它在Code First中工作嗎?示例請 – Dismissile

回答

1

它看起來像你的AddStatus方法不關閉連接,這似乎是EF抱怨。

也就是說,您也可以使用Database.ExecuteSqlCommand查看執行存儲過程。傳遞參數的語法有點不同(按照this answer):

var firstName = "John"; 
var id = 12; 
var sql = @"Update [User] SET FirstName = {0} WHERE Id = {1}"; 
ctx.Database.ExecuteSqlCommand(sql, firstName, id); 
+0

您無法打開關閉的連接。我原本是關閉它:) – Dismissile

+0

@Dismissile,所以你把它打開,EF抱怨它必須關閉,如果你關閉它,EF抱怨它無法打開它? :D聽起來像使用ExecuteSqlCommand(如果它適用於你的情況)最簡單,並讓EF管理連接狀態。 –

+0

我打算現在使用。我沒有意識到它存在。 – Dismissile