我使用代码第一实体框架做我所有的数据库检索。不幸的是,在我工作的地方,他们强制要求任何更新/插入/删除都必须使用存储过程来完成。
我从下面开始:
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.
是否有任何方法我可以像这样混合代码,或者我必须创建另一个连接到我的数据库?如果我创建一个新的连接,比如分布式事务,如果我需要一个事务范围,我会遇到问题吗?
看起来您的AddStatus
方法没有关闭连接,这似乎是EF所抱怨的。
也就是说,您还可以考虑使用Database.ExecuteSqlCommand
执行存储过程。传递参数的语法略有不同(根据这个答案):
var firstName = "John";
var id = 12;
var sql = @"Update [User] SET FirstName = {0} WHERE Id = {1}";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);