Ссылка на структуру сущности нескольких строк?

Как я могу ссылаться на свой столбец в table1 на несколько строк другой таблицы в Entity-Framework, работающей с настраиваемыми свойствами навигации?

эта проблема может быть решена в SQL с помощью временной таблицы, которая предлагается в Как вы можете ссылаться на несколько строк в другой таблице?

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

Jazb 11.12.2018 08:49

Я помещаю ссылку на пример в свой вопрос. но если вам нужны дополнительные объяснения, я подготовлю для вас пример. обратите внимание, что это известная проблема использования тегов или базовой таблицы ролей в SQL.

Mahdi Rastegari 11.12.2018 08:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
945
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если одна строка таблицы базы данных относится к нескольким строкам в другой таблице той же базы данных, то мы говорим, что между этими двумя таблицами существует отношение «один ко многим».

Например: таблица со школами и таблица со студентами. Каждая школа в таблице школ имеет ноль или более учеников из таблицы учеников.

В реляционной базе данных отношение «один ко многим» реализуется путем добавления дополнительного столбца к таблице «многие»: внешнего ключа к одной таблице.

В базе данных School-Student мы добавим внешний ключ в таблицу Student, который будет указывать на школу, к которой принадлежит этот студент. Таким образом, все ученики школы с первичным ключом 4 будут иметь одинаковое значение для внешнего ключа: 4

Если вы будете следовать Соглашения о первом кодировании кода структуры сущности, у вас будет что-то похожее на:

class School
{
    public int Id {get; set;}          // will become the primary key
    public string Name {get; set;}
    ... // other properties

    // every School has zero or more Students (one-to-many)
    public virtual ICollection<Student> Students {get; set;}
}

class Student
{
    public int Id {get; set;}          // will become the primary key
    public string Name {get; set;}
    public DateTime BirthDate {get; set;}
    ... // other properties

    // every Student belongs to exactly one School, using foreign key:
    public int SchoolId {get; set;}
    public virtual School School {get; set;}
}

DbContext:

class SchoolContext : DbContext
{
    public DbSet<School> Schools {get; set;}
    public DbSet<Student> Students {get; set;}
}

Это все, что требуется инфраструктуре сущностей для идентификации ваших таблиц, столбцов таблиц и связи между таблицами. Только если вы хотите использовать другие идентификаторы или поведение, отличное от стандартного, вам нужно будет добавить атрибуты или использовать свободный API.

In entity framework the columns of the tables are represented by non-virtual properties. The virtual properties represent the relations between the tables (one-to-many, many-to-many, ...)

Люди с опытом работы с базами данных склонны мыслить операторами SQL, которые они переводят в LINQ. Однако использование виртуальных свойств упрощает запросы.

Give me the names of all Students together with the name of the school they attend.

var result = dbContext.Students.Join(dbContext.Schools, // join students and schools
    student => student.SchoolId,                        // from Student take the SchoolId,
    school => school.Id,                                // from School take the Id,
    (student, school) => new                            // when they match, make a new object
    {
        StudentName = student.Name,
        SchoolName = school.Name,
    });

Использование виртуальных свойств облегчает жизнь:

var result = dbContext.Students.Select(student => new
{
     StudentName = student.Name,
     SchoolName = student.School.Name,
});

Прописью: из коллекции учеников выберите у каждого ученика его имя и название его (единственной) школы.

Поскольку я использовал виртуальные свойства, код выглядит намного проще. Entity framework знает отношения между таблицами и знает, что для этого необходимо внутреннее соединение.

Give me the names of all Schools with the names of their students

var schoolsWithTheirStudents = dbContext.Schools.Select(school => new
{
     Name = school.Name,
     StudentNames = school.Students.Select(student => student.Name).ToList(),
});

Словами: из коллекции школ выберите для каждой школы ее названия, а для каждого ученика в этой школе - его имя.

If you have a one-to-many in entity framework and you want to do an inner join, start with the many side (Students). If you want to do a GroupJoin, start with the one side (Schools)

Спасибо за ваш ответ, который исчерпывающий. Похоже, я дал вам много плохих описаний. Проблема известна как отношение "несколько к нескольким" в SQL, решение которой в SQL заключалось в использовании временной таблицы.

Mahdi Rastegari 11.12.2018 10:27

Если ваше отношение не «один-ко-многим», а «многие-ко-многим», используйте Google для структуры сущностей «многие-ко-многим». Вы обнаружите, что на обеих сторонах есть virtual ICollection<other many side>. Это внутренне создаст соединительную таблицу. Всякий раз, когда вы используете структуру сущностей ICollection, будет использоваться таблица соединений для выполнения правильного (группового) соединения

Harald Coppoolse 11.12.2018 11:21

Другие вопросы по теме