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





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