Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQLite, EntityFrameworkCore: include не работает / 25 сообщений из 25, страница 1 из 1
05.11.2017, 01:28
    #39547920
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
People и Orders связаны "многие ко многим" через OrdersToPeople
Код: c#
1.
2.
3.
4.
5.
6.
7.
var list = myDbContext.People
    .Include(t => t.OrdersToPeople);
foreach (var element in list)
{
    var c = element.OrdersToPeople.Count;
    //c всегда равен 0. Хотя своими глазами вижу, что в БД записи есть.
}



list загружается, все простые поля (int, string) в нём заполнены. А вот таблица OrdersToPeople пустая. Почему - понять не могу.
...
Рейтинг: 0 / 0
05.11.2017, 01:52
    #39547926
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,

либо связи не установлены, либо нет virtual
...
Рейтинг: 0 / 0
05.11.2017, 02:22
    #39547929
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Все классы DbContext были сгенерированы с помощью SQLite Tools. Связи есть, поскольку если б их не было, тогда бы и поля соответствующего в People не сгенерировалось бы.
Ничего особенного в DbContext нет, всё оформлено как положено, все доп.поля через virtual
Код: c#
1.
2.
3.
4.
5.
6.
public partial class MyDbContext : DbContext
{
    public virtual DbSet<People> People { get; set; }
    public virtual DbSet<OrdersToPeople> OrdersToPeople { get; set; }
    public virtual DbSet<Orders> Orders { get; set; }
    ...


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public partial class People
{
    public long Id { get; set; }
    public string Surname { get; set; }
    public string Name { get; set; }
    public virtual ICollection<OrdersToPeople> OrdersToPeople { get; set; }
    public People()
    {
        OrdersToPeople = new HashSet<OrdersToPeople>();
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public partial class OrdersToPeople
{
    public long Id{ get; set; }
    public long PeopleId { get; set; }
    public long OrderId { get; set; }
    public virtual People People { get; set; }
    public virtual Orders Orders { get; set; }
}

...
Рейтинг: 0 / 0
05.11.2017, 12:26
    #39547960
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен
Код: c#
1.
OrdersToPeople = new HashSet<OrdersToPeople>();

А это зачем?
...
Рейтинг: 0 / 0
05.11.2017, 17:17
    #39548026
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
refreg,

мне так SQLite Tools нагенерировал. Пробовал все HashSet и ICollection заменить на List - эффект тот же. include не работает.
...
Рейтинг: 0 / 0
05.11.2017, 19:42
    #39548056
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Хм.
Если немного расширить код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var list = myDbContext.People
    .Include(t => t.OrdersToPeople);
var experiment = myDbContext.OrdersToPeople
foreach (var element in experiment)
{
    //не важно. Главное, что список прочитался
}
foreach (var element in list)
{
    var c = element.OrdersToPeople.Count;
    //Теперь c == 2. Т.е. теперь всё нормально прочиталось.
}


Разве не должно было прочитаться сразу? Почему только при попытке получения доступа?
...
Рейтинг: 0 / 0
05.11.2017, 20:09
    #39548062
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,
А почему вы тему не в той ветке?
...
Рейтинг: 0 / 0
05.11.2017, 20:19
    #39548065
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,

я не вижу атрибута InverseProperty .
...
Рейтинг: 0 / 0
05.11.2017, 20:39
    #39548073
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласенсгенерированы с помощью SQLite Tools.
Нагенерированы из чего?
Второй класс какой то странный для один ко много.
Дублирование полей, какая то коллекция...
Дайте бд схему с которорой была генерация.
Или схему что нагенерит код, если это коде first.
...
Рейтинг: 0 / 0
05.11.2017, 20:49
    #39548076
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
hVosttхорошо я согласен,

я не вижу атрибута InverseProperty .

В целом конвенции конечно работают, но лучше фиксировать атрибутами или конфигурацией отражения.
...
Рейтинг: 0 / 0
05.11.2017, 21:33
    #39548094
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Petro123Нагенерированы из чего?
Я создал БД, соединил все таблицы связями. А потом с помощью SQLiteTools сгенерировал серию классов dbContext из это БД.
Есть два способа: либо с помощью атрибутов, либо путём указания всех связей и зависимостей в классе MyDbContext: DbContext, в функции
Код: c#
1.
protected override void OnModelCreating(ModelBuilder modelBuilder)


что я и сделал.
...
Рейтинг: 0 / 0
05.11.2017, 21:36
    #39548096
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Petro123Дайте бд схему с которорой была генерация.
Или схему что нагенерит код, если это коде first.
так я ж привёл.
Просто две таблицы People и Orders, соединённых с помощью промежуточной. Нагенерированный код я привёл в сообщении выше - 20928086
...
Рейтинг: 0 / 0
05.11.2017, 21:57
    #39548103
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Короче, приведу более конкретный пример:
Код: c#
1.
2.
3.
4.
5.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople).ToList();
var b = a[0].OrdersToPeople.Count; // b равно нулю
var c = myDbContext.OrdersToPeople.ToList();
var d = a[0].OrdersToPeople.Count; // d равно 2


Разве include не должен был подгрузить нужную информацию так, чтобы b была равна двум? Обязательно мне делать фиктивное обращение индвивидуально для OrdersToPeople?
...
Рейтинг: 0 / 0
05.11.2017, 22:10
    #39548110
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласенPetro123Дайте бд схему с которорой была генерация.
Или схему что нагенерит код, если это коде first.
так я ж привёл.
Просто две таблицы People и Orders, соединённых с помощью промежуточной. Нагенерированный код я привёл в сообщении выше - 20928086
Не вижу СХЕМУ БАЗЫ.
Я недавно в шара, но базы знаю хорошо)
...
Рейтинг: 0 / 0
05.11.2017, 22:20
    #39548116
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Petro123в шара,в шарпе)
...
Рейтинг: 0 / 0
05.11.2017, 23:18
    #39548152
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Petro123Не вижу СХЕМУ БАЗЫ.
...
Рейтинг: 0 / 0
06.11.2017, 00:05
    #39548181
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,
здорово.
Теперь было бы здорово включить отладку в EF и показать реальный запрос к базе от linq.
Либо поискать на фразу EF +"много ко много"
...
Рейтинг: 0 / 0
06.11.2017, 00:08
    #39548185
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,
Вот я пример нагуглил:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
 
    public ICollection<Player> Players { get; set; }
    public Team()
    {
        Players = new List<Player>();
    }
}
public class Player
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    public int Age { get; set; }
 
    public ICollection<Team> Teams { get; set; }
    public Player()
    {
        Teams = new List<Team>();
    }
}


А у вас что там нагенерила приблуда?
...
Рейтинг: 0 / 0
06.11.2017, 02:00
    #39548231
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Petro123А у вас что там нагенерила приблуда?
А вот у меня она ещё и промежуточную таблицу нагенерила.
Именно её нагенерированный код я и привёл выше:
Код: c#
1.
2.
3.
4.
5.
6.
public partial class MyDbContext : DbContext
{
    public virtual DbSet<People> People { get; set; }
    public virtual DbSet<OrdersToPeople> OrdersToPeople { get; set; }
    public virtual DbSet<Orders> Orders { get; set; }
    ...


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public partial class People
{
    public long Id { get; set; }
    public string Surname { get; set; }
    public string Name { get; set; }
    public virtual ICollection<OrdersToPeople> OrdersToPeople { get; set; }
    public People()
    {
        OrdersToPeople = new HashSet<OrdersToPeople>();
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public partial class OrdersToPeople
{
    public long Id{ get; set; }
    public long PeopleId { get; set; }
    public long OrderId { get; set; }
    public virtual People People { get; set; }
    public virtual Orders Orders { get; set; }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public partial class Orders
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Count { get; set; }
    public virtual ICollection<OrdersToPeople> OrdersToPeople { get; set; }
    public Orders()
    {
        OrdersToPeople = new HashSet<OrdersToPeople>();
    }
}


...
Рейтинг: 0 / 0
06.11.2017, 02:03
    #39548234
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,

Код: c#
1.
2.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople.Select(p => p.People)).ToList();



А вообще, надо избавиться от класса OrdersToPeople, он не нужен в данном случае.
...
Рейтинг: 0 / 0
06.11.2017, 09:31
    #39548265
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласен,
И ты её/его не спросил, когда нужно генерить, а когда нет промежуточную?
Я вот, знаю, что если это сущность, то нужно.
У тебя в базе полей дополнительных нет.
Значит это не сущность и генерить класс не нужно.
Логично?
...
Рейтинг: 0 / 0
06.11.2017, 11:50
    #39548314
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
Радуйтесь адепты DbContext!

За Вас все сделала студия!
...
Рейтинг: 0 / 0
06.11.2017, 16:02
    #39548417
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
хорошо я согласенrefreg,

мне так SQLite Tools нагенерировал. Пробовал все HashSet и ICollection заменить на List - эффект тот же. include не работает.Зачем вообще это инициализировать? EF за тебя это сам сделает.


hVosttхорошо я согласен,

Код: c#
1.
2.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople.Select(p => p.People)).ToList();


hVostt, поясни, плз.


хорошо я согласенКороче, приведу более конкретный пример:
Код: c#
1.
2.
3.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople).ToList();
var b = a[0].OrdersToPeople.Count; // b равно нулю


Было бы интересно глянуть сформированный запрос. Здесь запрос должен быть один, и содержать join.
...
Рейтинг: 0 / 0
06.11.2017, 23:06
    #39548613
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
refreghVosttхорошо я согласен,

Код: c#
1.
2.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople.Select(p => p.People)).ToList();



hVostt, поясни, плз.

Вообще, класс OrdersToPeople не нужен, связь многие-ко-многие EF реализует связующей таблицей и скрывает её наличие от пользователя, просто нужен Peoples с одной стороны и Orders с другой.
...
Рейтинг: 0 / 0
07.11.2017, 09:59
    #39548756
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, EntityFrameworkCore: include не работает
hVosttrefregпропущено...
hVostt, поясни, плз.

Вообще, класс OrdersToPeople не нужен, связь многие-ко-многие EF реализует связующей таблицей и скрывает её наличие от пользователя, просто нужен Peoples с одной стороны и Orders с другой.Тогда, видимо, имелось ввиду:
Код: c#
1.
2.
var a = myDbContext.People
    .Include(t => t.OrdersToPeople.Select(p => p.Orders )).ToList();

или
Код: c#
1.
2.
var a = myDbContext.Orders
    .Include(t => t.OrdersToPeople.Select(p => p.People )).ToList();
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQLite, EntityFrameworkCore: include не работает / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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