Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 EF 6. Хранимая процедура с использованием EntityCommand  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 481
Доброго времени суток!
Необходимо собрать список сущностей по результату выполнения ХП, можно конечно использовать:
ctx.Database.SqlQuery<Author>("GetAuthorByNickname @p0", name).ToList()

Но в этом случае заполнятся не все поля сущности Author, ибо некоторые из них помечены NotMapped и соответственно не будут считаны.
Нашел на MSDN пример:
http://msdn.microsoft.com/ru-ru/library/bb896274(v=vs.110).aspx
Можно ли его использовать при подходе CodeFirst?
Попробовал напрямую

+
public class CatalogContext : DbContext
...
public static List<Author> RawStoreCommand(string name)
        {
            List<Author> result = new List<Author>();
            var ctx = new CatalogContext();
            using (var conn = (EntityConnection)((IObjectContextAdapter)ctx).ObjectContext.Connection)
            {
                conn.Open();
                // Create an EntityCommand.
                using (EntityCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "GetAuthorByNickname";
                    cmd.CommandType = CommandType.StoredProcedure;
                    EntityParameter pName = new EntityParameter();
                    pName.ParameterName = "name";
                    pName.Value = name;
                    cmd.Parameters.Add(pName);
                    

                    // Execute the command.
                    using (EntityDataReader rdr = cmd.ExecuteReader()) //ХХХ
                    {
                        // Read the results returned by the stored procedure.
                        while (rdr.Read())
                        {
                            Author author = new Author();
                            author.Id = rdr.GetInt32(0);
                            author.Nickname = rdr.GetString(1);
                            author.Birthdate = rdr.GetDateTime(2);
                            author.ArticlesCount = rdr.GetInt32(3);
                            result.Add(author);
                        }
                    }
                    conn.Close();
                }
            }
            return result;
        }

На строчке ХХХ вылетает exception:
The value of EntityCommand.CommandText is not valid for a StoredProcedure command. The EntityCommand.CommandText value must be of the form 'ContainerName.FunctionImportName'

Если вместо Entity использовать DbConnection, DbCommand, SqlParameter, DbDataReader
+
public static List<Author> RawStoreCommand(string name)
        {
            List<Author> result = new List<Author>();
            var ctx = new CatalogContext();
            using (var conn = ctx.Database.Connection)
            {
                conn.Open();
                // Create an EntityCommand.
                using (DbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "GetAuthorByNickname";
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter pName = new SqlParameter();
                    pName.ParameterName = "name";
                    pName.Value = name;
                    cmd.Parameters.Add(pName);
                    

                    // Execute the command.
                    using (DbDataReader rdr = cmd.ExecuteReader())
                    {
                        // Read the results returned by the stored procedure.
                        while (rdr.Read())
                        {
                            Author author = new Author();
                            author.Id = rdr.GetInt32(0);
                            author.Nickname = rdr.GetString(1);
                            author.Birthdate = rdr.GetDateTime(2);
                            author.ArticlesCount = rdr.GetInt32(3);
                            result.Add(author);
                        }
                    }
                    conn.Close();
                }
            }
            return result;
        }

то все работает. EntityCommand работает только при ModelFirst и DBFirst подходах?
2 апр 14, 10:55    [15819944]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить