Выполнить StoredProcedure в CodeFirst 4.1 - PullRequest
5 голосов
/ 25 апреля 2011

Я понимаю, что отображение хранимых процедур не поддерживается моим пониманием того, что я должен иметь возможность вызывать хранимые процедуры.

У меня довольно много сложных хранимых процедур, и с конструктором я мог бы создать сложный тип иУ меня все было хорошо.

Теперь в коде сначала давайте предположим, что у меня есть следующая хранимая процедура, просто соберите что-то глупое, чтобы дать идею.Я хочу вернуть студента с 1 адресом.

В коде у меня есть Студенческая и адресная организация.Но нет StudentAddressEntity, поскольку это таблица ссылок.

Я пробовал следующее, но получаю ошибку

Неверный синтаксис рядом с '. "}
System.Data.Common.DbException {System.Data.SqlClient.SqlException}

ALTER Procedure [dbo].[GetStudentById]
   @StudentID int
AS
   SELECT  *
   FROM Student S
   left join StudentAddress SA on S.Studentid = sa.studentid
   left join Address A on SA.AddressID = A.AddressID
   where S.StudentID = @StudentID

C # code:

using (var ctx = new SchoolContext())
{
   var student = ctx.Database.SqlQuery<Student>("GetStudentById,@StudentID",
                                                new SqlParameter("StudentID", id));
}

Любые примеры, как вызвать sp и заполнить complexType в кодево-первых, используя параметры и т. д. Могу ли я подключиться к ADO.NET?

Попытка просто SP, который возвращает всех студентов без параметров, я получаю эту ошибку

System.SystemException =Невозможно создать значение для свойства 'StudentAddress' типа 'CodeFirstPrototype.Dal.Address'. Поддерживаются только свойства с примитивными типами.

Это потому, что я каким-то образом игнорирую таблицу ссылок?

Есть предложения?

Ответы [ 2 ]

7 голосов
/ 25 апреля 2011

Я считаю, что ваше исключение на самом деле:

Неверный синтаксис рядом с ','.

потому что это недопустимое утверждение: "GetStudentById,@StudentID". Должно быть без запятой: "GetStudentById @StudentID".

Проблема с хранимыми процедурами в EF заключается в том, что они не поддерживают загрузку свойств навигации. EF материализует только основную сущность и навигационные свойства не будут загружены. Это решается, например, EFExtensions . EFExtensions для API-интерфейса ObjectContext, поэтому вам необходимо проверить, можно ли его использовать и для API-интерфейса DbContext.

0 голосов
/ 27 февраля 2012

При использовании EFExtentions это будет выглядеть примерно так:

using (var context = new SchoolContext())
{
    var command = context.CreateStoreCommand("GetStudentById", CommandType.StoredProcedure,
      new SqlParameter("StudentID", id));

    using (command.Connection.CreateConnectionScope())
    using (var reader = command.ExecuteReader())
    {
        // use the reader to read the data
        // my recommendation is to create a Materializer using EFExtensions see 
        // http://blogs.msdn.com/b/meek/archive/2008/03/26/ado-entity-framework-stored-procedure-customization.aspx

        // ex
        var student = Student.Materializer.Materialize(reader).SingleOrDefault();

        return student;
   }
}
...