Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
MS SQL

Entity Framework: не создается промежуточная таблица для связи "многие-ко-многим"

14.01.2018, 18:49. Показов 5969. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Пытаюсь создать базу данных и наполнить ее чем то. База создается и наполняется, но вот при вытягивании данных "вытягиваются" не все данные.
Путем просмотра базы в SQL Server Management Studio выяснила, что не создается промежуточная таблица для связи "многие-ко-многим". Вот тут то и теряются данные. Уже не один день пытаюсь найти ошибку и ничего не получается.

Помогите пожалуйста!

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
 
public class Role
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int RoleId { get; set; }
    public string Name { get; set; }
}
public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public Role Role { get; set; }
    public string PhoneNumber { get; set; }
    public ICollection<Task> Tasks { get; set; }
 
    public User()
    {
        Tasks = new List<Task>();
    }
}
 
public class Type
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TypeId { get; set; }
    public string Description { get; set; }
}
 
public class Task
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TaskId { get; set; }
    public string Description { get; set; }
    public string ClientNumber { get; set; }
    public string ClientName { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime DateEnd { get; set; }
    public Type Type { get; set; }
    public bool IsComplete { get; set; }
    public User User { get; set; }
    public ICollection<User> Users { get; set; }
 
    public Task()
    {
        Users = new List<User>();
    }
}
 
public class DataBaseContext : DbContext
{
    public DbSet<Role> Roles { get; set; }
    public DbSet<Type> Types { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Task> Tasks { get; set; }
    public DataBaseContext(string connection) : base(connection) { }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2018, 18:49
Ответы с готовыми решениями:

Entity Framework в модель не добавляется таблица со связью многие ко многим
Всем привет. Проблема в следующем, в модель представления данных Entity Framework не могу добавить таблицу со связью многие ко многим....

Entity Framework 6. Code First. Связь один-ко-многим и многие-ко-многим одновременно
Здрасти. Есть таблица юзеров и объявлений. У юзера может быть множество объявлений. Здесь действует связь один-ко-многим. Но юзер также...

Entity Framework многие-ко-многим
Добрый день! Прошу прощения, если создал тему не в том разделе. Ситуация такая: Использую EF CodeFirst. Есть классы, которые...

13
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
15.01.2018, 03:14
А как у вас должна выглядеть таблица многие ко многим просто composite key из юзеров и задач или у нее есть свой primary key?
Вот тут пример делал с многие ко многим таблица route Есть запрос в SQL какой можно сделать аналог в LINQ

Вот примеры https://docs.microsoft.com/en-... p-patterns чуть ниже есть many to many
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
15.01.2018, 04:00
irises, Возможно вы чего то не дописали. Код контекста не весь. OnModelCreating не хватает (или конфигурации).
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
15.01.2018, 19:21  [ТС]
Цитата Сообщение от _exp10der_ Посмотреть сообщение
А как у вас должна выглядеть таблица многие ко многим просто composite key из юзеров и задач или у нее есть свой primary key?
Раньше, когда на парах изучали Entity Framework, то промежуточная таблица создавалась сама. Неужели я что то спутала?

Цитата Сообщение от escoult Посмотреть сообщение
Возможно вы чего то не дописали. Код контекста не весь. OnModelCreating не хватает (или конфигурации).
Раньше не писали OnModelCreating. Но когда уже рылась в просторах интернета, то пыталась дописать вот таким способом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasMany(user => user.Tasks)
        .WithMany(task => task.Users)
        .Map(map =>
        {
            map.ToTable("UsersTasks");
            map.MapLeftKey("UserId");
            map.MapRightKey("TaskId");
        });
}
Не знаю, правильно ли описано, но данный способ также не работает.
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
15.01.2018, 21:58
irises, Сама не может создаваться. Фреймворк ее создает. А для этого нужна конфигурация. Надо же опредилить взаимоотношения, ключи.
Можно и не писать OnModelCreating, но конфигурация все равно нужна. Тогда для каждой модели пишется класс конфигурации. Мне удобнее переопределить OnModelCreating.
То что вы написали, давно не работает. Я даже не застал те времена, когда это работало. ManyToMany определяется взаимоотношениемя один-ко-многим через дополнительную модель.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//модели
 
 public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string Lastname { get; set; }
 
        public virtual ICollection<PersonEmail> PersonEmails { get; set; }
 
        public Person()
        {
            PersonEmails = new List<PersonEmail>();
        }
    }
 
 public class Email
    {
        public int Id { get; set; }
        public string EmailValue { get; set; }
 
        public virtual ICollection<PersonEmail> PersonEmails { get; set; }
 
        public Email()
        {
            PersonEmails = new List<PersonEmail>();
        }
    }
 
//модель, связывающая Person и Email 
 public class PersonEmail
    {
        public int PersonId { get; set; }
        public Person Person { get; set; }
 
        public int EmailId { get; set; }
        public Email Email { get; set; }
    }
 
 
 public class DatabaseContext : DbContext
    {
        public DatabaseContext() : base()
        { }
 
        public DbSet<Person> Persons { get; set; }
        public DbSet<Email> Emails { get; set; }
 
        protected override void OnModelCreating(ModelBuilder builder)
        {
            //конфигурация ManyToMany:
 
            builder.Entity<PersonEmail>()
                .HasKey(pe => new { pe.PersonId, pe.EmailId });
 
            builder.Entity<PersonEmail>().HasOne(pe => pe.Person)
                .WithMany(p => p.PersonEmails)
                .HasForeignKey(pe => pe.PersonId);
 
            builder.Entity<PersonEmail>().HasOne(pe => pe.Email)
               .WithMany(e => e.PersonEmails)
               .HasForeignKey(pe => pe.EmailId);
 
        }
 
        protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder)
        {
            optionBuilder.UseSqlServer(@"Server = (localdb)\MSSQLLocalDB; 
                Database = PersonEmailDatabase; Trusted_Connection = True; ");
        }
    }
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
15.01.2018, 22:13  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Сама не может создаваться. Фреймворк ее создает.
Я использовала этот сайт Configure Many-to-Many Relationship in Code-First и там сказано, что фреймворк создает промежуточную таблицу, без явного создания промежуточного класса.
Я только что протестировала пример, который указан там. И он создает промежуточную таблицу. Сам
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
15.01.2018, 22:46
irises, Core 2

Я пишу про Core ?)).
Да, возможно вы правы, если это .Net Standard. Там EF поддерживает ManyToMany и создавать промежуточную таблицу не требуется. Я думал про Core. Sorry.

Ну а тогда, какие данные у вас не вытягиваются, если все работает и таблица создается?
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
15.01.2018, 23:22  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Я пишу про Core ?)).
Да, возможно вы правы, если это .Net Standard. Там EF поддерживает ManyToMany и создавать промежуточную таблицу не требуется. Я думал про Core. Sorry.
Я пока не очень сильно разбираюсь в Core и другом. Если бы знала, то уточнила бы о чем говорю

Цитата Сообщение от escoult Посмотреть сообщение
какие данные у вас не вытягиваются, если все работает и таблица создается?
Все работает только у примера из сайте, а вот у моей базы не хочет работать И я никак не могу найти ошибку

Добавлено через 14 минут
Кажись нашла, почему не хочет создавать промежуточную таблицу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Task
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TaskId { get; set; }
    public string Description { get; set; }
    public string ClientNumber { get; set; }
    public string ClientName { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime DateEnd { get; set; }
    public Type Type { get; set; }
    public bool IsComplete { get; set; }
    //public User User { get; set; } //если это поле убрать, то таблица создается
    public ICollection<User> Users { get; set; }
 
    public Task()
    {
        Users = new List<User>();
    }
}
У меня в классе Task есть две ссылки на класс User (один юзер и список юзеров). Если убрать ссылку на одного юзера и оставить ICollection<User>, то все работает.

Но дело в том, что мне нужен этот юзер. Как его можно оставить?
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
16.01.2018, 05:10
Лучший ответ Сообщение было отмечено irises как решение

Решение

irises, Ищите где у вас ошибка, это нисколько не должно мешать.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 public class Student
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
 
        public Student()
        {
            Courses = new List<Course>();
        }
 
        //same as nav collection model field
        public Course FavoriteCource { get; set; }
 
        //many to many nav
        public virtual ICollection<Course> Courses { get; set; }
 
        public override string ToString()
        {
            return $"{Id} - {FirstName} {LastName}";
        }
    }
 
  public class Course
    {
        public int Id { get; set; }
        public string Name { get; set; }
 
        public Course()
        {
            Students = new List<Student>();
        }
 
        //many-to-many nav
        public virtual ICollection<Student> Students { get; set; }
 
        public override string ToString()
        {
            return $"{Id} - {Name}";
        }
    }
 
 public class Context : DbContext
    {
        public Context(): base("dbConnection")
        { }
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Cources { get; set; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
 
            modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(sc =>
                    {
                        sc.MapLeftKey("StudentId");
                        sc.MapRightKey("CourceId");
                        sc.ToTable("StudentCource");
                    });
 
        }
    }
1
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
16.01.2018, 05:15
update
Миниатюры
Entity Framework: не создается промежуточная таблица для связи "многие-ко-многим"  
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
16.01.2018, 11:45  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Ищите где у вас ошибка, это нисколько не должно мешать.
Нашла, нужно было добавить лишь модификатор virtual и все работает.

Теперь, зная что нужно гуглить, поняла зачем нужен этот virtual. Здесь было обьяснение Отложенная загрузка (lazy loading).

Нужно ли использовать virtual для public Course FavoriteCource { get; set; }?
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
16.01.2018, 15:00
Цитата Сообщение от irises Посмотреть сообщение
Нужно ли использовать virtual для public Course FavoriteCource { get; set; }?
Это зависит от того как вы собираетесь использовать свойство FavoriteCourse и нужна ли вам "ленивая загрузка".

C#
1
2
3
4
5
6
7
 //так будет работать в обоих случаях
 var query = context.Students.Include("FavoriteCource").FirstOrDefault();
 Console.WriteLine(query.FavoriteCource.Name);
 
 //так будет работать только если свойство FavoriteCourse помечено virtual
 var query = context.Students.FirstOrDefault();
Console.WriteLine(query.FavoriteCource.Name);
1
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
16.01.2018, 23:43  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Это зависит от того как вы собираетесь использовать свойство FavoriteCourse и нужна ли вам "ленивая загрузка".
Сколько еще нужно выучить и разобратся во всем этом

escoult, спасибо большое за помощь и терпение!
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
17.01.2018, 01:11
Рад был помочь, irises, ?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2018, 01:11
Помогаю со студенческими работами здесь

Связь многие ко многим (Entity Framework)
Мне нужна связь многие ко многим. Нашел вот тут хороший туториал который объясняет как ее сделать на Entity Framework. Но не понятно что...

Связь многие-ко-многим в Entity Framework
делаю задания с моделями сущностей entity framework. на примере студентов и курсов, у каждого студента может быть несколько курсов, как и у...

Entity framework, связь многие ко многим
Доброго времени суток ! Зарание извиняюсь если поместил тему не в тот раздел. Вопрос такой у меня есть 2 таблицы со связкой...

Entity Famework не загружает коллекции элементов в связи многие ко многим
Доброго времени суток. У меня имеется следующая схема БД, сгенерированная Entity Framework. Для ее генерации я написал следующие...

LINQ-запрос при отношении "многие-ко-многим" (Entity Framework)
Добрый день! Второй вечер подряд не могу понять как в случае EF и Linq To Entites составить запрос при отношении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru