Я не уверен, понятно ли вам, что вы хотите смоделировать.
Каждый User
имеет ноль или более Files
, и каждый File
принадлежит ровно одному User
,Простое отношение один ко многим.
Более того: Files
может быть присвоено Validated
.Эта проверка выполняется одним или несколькими Users
.Такое назначение называется Validation
.Каждый Validation
соответствует ровно одному File
и выполняется ровно одним User
.Users
и Files
может иметь несколько Validations
: отношение «многие ко многим»
Для отношения «многие ко многим» нам нужна таблица соединений.Обычно в рамках сущности вам не нужно указывать соединительную таблицу.Entity Framework обнаружит взаимосвязь «многие ко многим» и создаст для вас соединительную таблицу.
Однако в вашей соединительной таблице есть несколько дополнительных столбцов, среди которых есть свойство, было ли назначение выполнено: Validation.IsValidated
,Вот почему вы должны указать соединительную таблицу.
В каркасе сущностей столбцы таблицы представлены не виртуальными свойствами.Виртуальные свойства представляют отношения между таблицами.
Я вижу несколько мест, где вы отклоняетесь от соглашений код-первых в рамках структуры сущностей .
- Прежде всего, ваши отношения не объявлены виртуальными.
- Вы также забыли объявить свои внешние ключи.
- Вы объявили свои свойства
many
как List
вместо ICollection
.Вы уверены, что File.Validation[4]
что-то значит?
Улучшенные определения классов, соблюдающие соглашения
class User
{
public int Id {get; set;}
... // other properties
// every User has zero or more Files (one-to-many)
public virtual ICollection<File> Files {get; set;}
// every user has zero or more Validations
public virtual ICollection<Validation> Validations {get; set;}
}
class File
{
public int Id {get; set;}
... // other properties
// every File belongs to exactly one User, using foreign key
public int UserId {get; set;}
public User User {get; set;}
// every File has zero or more Validations (one-to-many)
public virtual ICollection<Validation> Validations {get; set;}
}
и, наконец, таблица соединений, которая находится в валидации:
class Validation
{
public int Id {get; set;}
public bool IsValidated {get; set;}
... // other properties
// every validation belongs to exactly one File, using foreign key
public int FileId {get; set;}
public virtual File File {get; set;}
// every validation belongs to exactly one User, using foreign key
public int UserId {get; set;}
public virtual User User {get; set;}
}
Вы писали:
Я пытаюсь получить файлы, которые не были проверены пользователем
int userId = ...
var fileNotValidatedByUser = myDbContext.Validatin // from all Validations
.Where(validation => validation.UserId == userId // keep the ones from the specified user
&& !validation.Isvalidated) // that are not validated yet
.Select(validation => validation.File) // from each remaining validation
// get the File.
};
Запросить все файлы, которыеиметь одну или несколько проверок, которые еще не проверены
var filesNotCompletelyValidated = myDbContext.Files // from the collection of Files
.Where(file => file.Validations // keep only those files that
.Where(validation => !validation.IsValidated) // have at least one Validation
.Any()); // that is not Validated yet.
Запросить все файлы, которые не были проверены вообще
var filesNotCompletelyValidated = myDbContext.Files // from the collection of Files
.Where(file => !file.Validations // keep only those files that
.Where(validation => validation.IsValidated) // that have no Validation
.Any()); // that is Validated.