Установить значение свойства POCO по умолчанию из DB.Entity - PullRequest
1 голос
/ 09 июля 2019

У меня есть класс POCO, где у меня есть определенное свойство (называемое: is_confirmed), не сопоставленное с базой данных.Вместо этого я хочу, чтобы это свойство проверяло в другой таблице, является ли какое-либо значение is_confirmed истинным для определенного пользователя.Я попытался с помощью приведенного ниже кода, но он выдает ошибку: is_confirmed = The function evaluation requires all threads to run.

Мой вопрос состоит из 2 частей:

  1. Как передать псевдоним текущего пользователя

  2. Как я заставляю это работать, так как теперь это не производит значение, но ошибка

Вот мой код пока.

   [Table("participants")]
    public class participant
    {
        public int ID { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public string alias { get; set; }

        [NotMapped]
        public Boolean is_confirmed
        {
            get
            {
                dbContext DB;
                DB = new dbContext();
                return DB.confirmedParticipants.Where(x => x.is_confirmed == true && x.participantAlias == "aliashere").ToList().Count > 0;
            }
            set {  }
        } 

    }

1 Ответ

0 голосов
/ 09 июля 2019

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

Не зная больше о структуре таблицы, учитывая только детали, которые вы раскрыли:

[Table("participants")]
public class participant
{
    [Key]
    public int ID { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    [ForeignKey("Confirmations")]
    public string alias { get; set; }

    public virtual ICollection<ParticipantConfirmations> Confirmations { get; set; } = new List<ParticipantConfirmation>();
}
[Table("confirmedParticipants")]
public class ParticipantConfirmation
{
    [Key]
    public string alias { get; set; }
    public bool is_confirmed { get; set; }
    // etc.
}

Затем при чтении модели представления для Участника:

[Serializable]
public class ParticipantViewModel
{
    public int ID { get; set; }
    public string FullName { get; set; }
    public string Alias { get; set; }
    public bool IsConfirmed { get; set; }
}

типичный Выбор:

var participantVMs = db.Participants.Where(x => /* some condition */)
    .Select(x => new ParticipantViewModel
    {
        ID = x.ID,
        FullName = x.firstname + " " + x.lastname,
        Alias = x.alias,
        IsConfirmed = x.Confirmations.Any(c => c.is_confirmed)
     }).ToList();

Ключевой момент об EF ...

Избегайте подобных вещейthis:

.Where(x => x.is_confirmed == true && x.participantAlias == "aliashere").ToList().Count > 0;

Вместо этого используйте:

.Any(x => x.is_confirmed && x.participantAlias == "aliashere");

Первый оператор будет эффективно делать SELECT * FROM [Participant_Confirmed] WHERE is_confirmed = true AND participant_alias = 'aliashere', который будет возвращать все поля для всех соответствующих строк просто, так что вы можете проверить, чтобы увидетьесли строка существует.

Второй оператор будет эффективно выполнять SELECT EXISTS ..., который будет возвращать результат True или False, который является более быстрым запросом с использованием меньшего количества памяти, и отправляет намного меньше данных по сети.

По догадкам из названий и полей может показаться, что подтвержденные участники будут видеть, как участники сглаживают, подтвержден участник или нет.Если бы это было так, я бы просто использовал сущность, связанную с этим представлением, для операции чтения, а затем загружал Участника, если / когда я хотел обновить данные об участнике.Трудно определить, не видя всей картины, но я подозреваю, что есть некоторые значительные оптимизации, которые вы можете использовать, чтобы избежать слишком частого обращения к БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...