Структура сущности Relation Mapping - PullRequest
0 голосов
/ 23 октября 2018

В проекте, над которым я постоянно работаю, я остановился на том, что раньше никогда не использовал картографию и т. Д., Поэтому я не считаю себя архитектором проекта, но для этого проекта мне пришлось стать архитектором.Так как я не очень хорош в этой теме, я прочитал об этом и решил использовать первый подход кода.В моем проекте есть 3 таблицы VALIDATION USER и FILE.

В основном, таблица USER сохраняет пользователя и пароль. В таблице FILE есть имена изображений, которые были загружены пользователями, и эти изображения должны быть проверены другими пользователями, которыеподводит меня к таблице VALIDATION.В таблице проверки у меня есть идентификатор, USERID, FILEID, чтобы вести учет того, кто что проверял.

Один пользователь может проверить одно и то же изображение только один раз.

Здесь вы можете увидеть мои модели

public class File
{
    public int ID { get; set; }
    public string FILE_NAME { get; set; }
    public string URL { get; set; }
    public bool FINAL_IS_VALID { get; set; }
    public DateTime CREATED_DATE { get; set; }
    public int REQ_COUNT { get; set; }
    public int CUR_COUNT { get; set; }
    public double REQ_PER_CENT { get; set; }
    public double CUR_PER_CENT { get; set; }

    public User USER { get; set; }

    public List<Validation> VALIDATION { get; set; }

    public List<Label> LABEL { get; set; }
}

public class User
{
    public int ID { get; set; }
    public string EMAIL { get; set; }
    public string PASSWORD { get; set; }
    public DateTime CREATED_DATE { get; set; }
    public bool IS_ADMIN { get; set; }

    public List<File> FILE { get; set; }

    public List<Validation> VALIDATION { get; set; }
}

public class Validation
{
    public int ID { get; set; }
    public bool IS_VALID { get; set; }
    public DateTime VALIDATION_DATE { get; set; }

    public User USER { get; set; }

    public File FILE { get; set; }
}

Я сделал большую часть своей работы с этой структурой.Однако, когда я пытаюсь получить файлы, которые не были проверены пользователем, я не могу сделать это с помощью linq.

DbObjects.FILE.Include(x => x.USER).Include(x => x.VALIDATION).ThenInclude(x=>x.USER).Where(x => x.FINAL_IS_VALID != true).ToList(); 

в этой структуре я не могу добраться до file.validate.user, что мне делать?Правильна ли моя структура или есть лучший способ сделать это.Я не уверен, что прекрасно понимаю отображение.Спасибо.

1 Ответ

0 голосов
/ 23 октября 2018

Я не уверен, понятно ли вам, что вы хотите смоделировать.

Каждый 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...