混合实体框架与存储过程-连接问题



我使用代码第一实体框架做我所有的数据库检索。不幸的是,在我工作的地方,他们强制要求任何更新/插入/删除都必须使用存储过程来完成。

我从下面开始:

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);

最新更新