2011-11-23 39 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