Entity Framework 4 - сначала код и хранимые процедуры - PullRequest
2 голосов
/ 30 августа 2010

Я хочу выполнить хранимую процедуру с одним параметром, который возвращает таблицу, используя EF4 «Code First». Я в порядке с некоторыми DTO только для этой цели, он не должен возвращать объекты. Я пытался:

a) создайте файл edmx с функцией импорта и добавьте его в мой ObjectContext следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RegisterEdmx("Model.edmx");
}

, но я получил InvalidOperationException, говоря: «Регистрация существующей модели не может быть использована после того, как началось конфигурирование кода с использованием свободного API».

b) получить доступ к подчиненному соединению и выполнить процедуру:

    var connection = this.objectContext.UnderlyingContext.Connection;
    connection.Open();
    DbCommand command = connection.CreateCommand();
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "booklog.Recommendations";
    command.Parameters.Add(
        new EntityParameter("userId", DbType.Guid) { Value = this.userId });
    var reader = command.ExecuteReader();
    // etc.

, где

public class MyObjectContext : DbContext
{
    public System.Data.Objects.ObjectContext UnderlyingContext
    {
        get { return this.ObjectContext; }
    }

    // ....
 }

но этот подход не работает так же хорошо. Выдает InvalidOperationException с сообщением «Контейнер« Журнал », указанный для FunctionImport, не найден в текущем рабочем пространстве.»

1 Ответ

5 голосов
/ 31 августа 2010

Хорошо, б) правильно, но не нужно использовать UnderlyingContext, просто ObjectContext.Database.Connection. Вот код:

    var connection = this.objectContext.Database.Connection;
    connection.Open();

    DbCommand command = connection.CreateCommand();
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "Recommendations";
    command.Parameters.Add(
        new SqlParameter("param", DbType.Guid) { Value = id });

    var reader = command.ExecuteReader();
    while (reader.Read())
    {
        // ...
    }

    connection.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...