Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Model + DbContext: Индекс находился вне границ массива / 16 сообщений из 16, страница 1 из 1
23.04.2015, 23:37
    #38944014
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Проблема:
Если в Модели есть поля, а в запросе я их не указал, то вываливается сообщение:
Индекс находился вне границ массива
Пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
//Модель
    public class DirMenu
    {
        [Key]
        public int DirMenuID { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Url { get; set; }

        public string Controller { get; set; }
        public string Action { get; set; }
    }
...
//В Контроллере
    //Это класс " : DbContext"
    using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        //тут ошибка!!!
        var dirMenu = con.DirMenus.SqlQuery("SELECT Name, Url FROM DirMenus").ToList();
    }



При таком запросе вывалится ошибка
А если укажу все поля из модели ошибки не будет.
Ну так если в Модели 100 полей и я хочу сделать сложный запрос с JOIN-ами, то мне что надо указывать все поля всех задействованных таблиц???
...
Рейтинг: 0 / 0
23.04.2015, 23:54
    #38944019
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Код: c#
1.
var dirMenu = con.DirMenus.Select(n => new DirMenu() { Name = n.Name, Url = n.Url }).ToList();


Только DirMenu при таком подходе не будет сущностью, частью контекста, лучше для таких выборок использовать специальный класс, чтобы не путать с сущностями
...
Рейтинг: 0 / 0
24.04.2015, 00:09
    #38944022
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Код: c#
1.
var dirMenu = con.DirMenus.Select(n => new DirMenu() { Name = n.Name, Url = n.Url }).ToList();


Linq не юзаю, мне бы SQL-заросами.
Использую SQLite, а там при сложных запросах надо указывать используемые индексы, если в плане запроса они не задействованны.

То есть для каждого запроса свой класс создавать? Или создать один класс для всех запросов? И не задействовать его в классе "Контекст данных"?
...
Рейтинг: 0 / 0
24.04.2015, 00:09
    #38944023
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
potkin,

Нет перечислять поля не надо. Если задача вернуть тип "DirMenus", то можно указать все поля сущности так "SELECT DirMenus.* FROM DirMenus". Ежели нужно вернуть не совпадающий спикос полей, то нужно делать так...

Код: c#
1.
2.
3.
4.
5.
6.
 using (var ctx = new SchoolDBEntities())
    {
        //Get student name of string type
        string studentName = ctx.Database.SqlQuery<string>("Select studentname 
            from Student where studentid=1").FirstOrDefault<string>();
    }
...
Рейтинг: 0 / 0
24.04.2015, 00:18
    #38944025
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Relic Hunter string studentName = ...
А надо получить если список студентов?
...
Рейтинг: 0 / 0
24.04.2015, 00:33
    #38944029
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
potkin,

Код: c#
1.
List<String> studentName = db.Database.SqlQuery<String>("Select studentname from Student").ToList();
...
Рейтинг: 0 / 0
24.04.2015, 00:51
    #38944035
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Relic Hunter
Полей много.

Создал дополнительный класс DirMenuSQL с аналогичными полями "DirMenu", только без ключей и т.д. А так же не задействовал его в " : DbContext"
Код: c#
1.
2.
3.
4.
    using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        var dirMenu = con.Database.SqlQuery<DirMenuSQL>("SELECT Name, Url FROM DirMenus where ...").ToList();
    }



Вылетает ошибка:
Код: plaintext
1.
2.
3.
Исключение типа "System.Data.SQLite.SQLiteException" возникло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительные сведения: out of memory
unknown error
...
Рейтинг: 0 / 0
24.04.2015, 01:10
    #38944038
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
potkin
Код: c#
1.
2.
3.
4.
5.
using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        //тут ошибка!!!
        var dirMenu = con.DirMenus.SqlQuery("SELECT Name, Url FROM DirMenus").ToList();
    }


При таком запросе вывалится ошибка
А если укажу все поля из модели ошибки не будет.
А если добавить поле с PK? Т.е. DirMenuID.
...
Рейтинг: 0 / 0
24.04.2015, 01:20
    #38944041
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
potkinДополнительные сведения: out of memoryЗначит дофига засосал:) Синтаксис правильный.
...
Рейтинг: 0 / 0
24.04.2015, 10:19
    #38944224
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Таки заработало, но ...
Создал дополнительный класс DirMenuSQL с полями, которые участвуют в выборке.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class DirMenuSQL
    {
        [Key]
        public int DirMenuID { get; set; }
        public string Name { get; set; }
        public int SubID { get; set; }
        public string Url { get; set; }
        public string SubUrl { get; set; }
    }


И прописал в классе DbConnection : DbContext
Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class DbConnection : DbContext
    {
        public DbConnectionSQLite(string connString) : base(new SQLiteConnection(connString), true) { }

        public DbSet<Dir.DirMenu> DirMenus { get; set; }
        public DbSet<Dir.DirMenuSQL> DirMenuSQLs { get; set; }
    }


И всё заработало.

Как я понимаю, для каждого запроса надо плодить свой класс с полями, которые задействованы в запросе?
Я уверен на 100500%, что ошибаюсь, т.к. это полный бред. У меня к одной таблице может быть и 1000 запросов, это плодить 1000 классов? А сложные запросы, в которых задействованы 10-ки таблиц? А пользовательские запросы, что с ними делать?

Вопрос: где ошибаюсь ...
...
Рейтинг: 0 / 0
24.04.2015, 12:24
    #38944423
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
у вас entity framwork?
...
Рейтинг: 0 / 0
24.04.2015, 14:25
    #38944624
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
Ну да.
6.1.2
...
Рейтинг: 0 / 0
24.04.2015, 14:36
    #38944637
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
а нафига вы пишите тогда запросы на скул вместо линку , где сможете скинуть в анонимный объект?) конечно дальше локального методы вы не пропихнете анонимный объект а если дальше то придется делать некое dto. и это нормально. Если вы хотите сделать модель отличную от целевой вам придется делать некие dto сущности
...
Рейтинг: 0 / 0
24.04.2015, 14:59
    #38944696
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
handmadeFromRu а нафига вы пишите тогда запросы на скул вместо линку
Чуть выше писал:
potkinLinq не юзаю, мне бы SQL-заросами.
Использую SQLite, а там при сложных запросах надо указывать используемые индексы, если в плане запроса они не задействованны.

Посмотрел как Линк формирует запросы, мне не понравилось. Если честно, то я не тестил, но уверен, что скорость выполнения будет выше, если писать ручками. Хотя элементарные запросы будут и на Линке.

handmadeFromRuЕсли вы хотите сделать модель отличную от целевой вам придется делать некие dto сущности
?
...
Рейтинг: 0 / 0
24.04.2015, 16:04
    #38944777
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
potkin, извиняюсь что не понял сразу. вы хинты чтоль юзаете чтоб явно указать индекс?

Entity Framework: SqlQuery does not support mapping
http://bartwullems.blogspot.ru/2014/06/entity-framework-sqlquery-does-not.html
вам придется делать классы под каждый запрос, если вы не хотите использовать линку синтаксис.

п.с. зачем вам тогда орм если вы используете голые запросы ? легкий врапер над адо и вперед. или даж лучше dapper используйте, он как раз таки может память на частичные сущности.
...
Рейтинг: 0 / 0
24.04.2015, 19:33
    #38944974
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Model + DbContext: Индекс находился вне границ массива
handmadeFromRu
В SQLite можно в самом запросе указать индекс, который надо задействовать.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Model + DbContext: Индекс находился вне границ массива / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]