Выполнение хранимой процедуры в CodeFirst 4.1

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

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

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

Код С#:

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

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

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

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

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

Какие-либо предложения?


person user712923    schedule 25.04.2011    source источник


Ответы (2)


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

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

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

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

person Ladislav Mrnka    schedule 25.04.2011

Используя 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;
   }
}
person BarendB    schedule 26.02.2012