Смешивание Entity Framework с хранимыми процедурами - проблема подключения - PullRequest
1 голос
/ 23 ноября 2011

Я использую 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.

Можно ли как-то смешать код, подобный этому, или мне нужно создать другое соединение с моей базой данных? Будут ли возникать проблемы, если я создам новое соединение, такое как Распределенные транзакции, если мне нужна область транзакции?

1 Ответ

1 голос
/ 23 ноября 2011

Похоже, ваш 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);
...