Стремительная загрузка с необязательным свойством навигации c # EF - PullRequest
0 голосов
/ 19 октября 2018

Я использую готовую загрузку с моим текущим проектом, и в этом проекте у меня есть дополнительное свойство навигации.Это модель:

public enum AnswerType
{
    Preset,
    Formula
}

public class Answer: Key
{
    public int QuestionId { get; set; }
    public int? CriteriaId { get; set; }
    [Required] [MaxLength(255)] public string Text { get; set; }
    [Required] public AnswerType Type { get; set; }
    public int Order { get; set; }
    public int Priority { get; set; }
    [MaxLength(2083)] public string Image { get; set; }

    public Criteria Criteria { get; set; }
    public Question Question { get; set; }
    public Scenario Scenario { get; set; }
    public IList<AnswerFormula> Formulas { get; set; }
    public IList<Image> Images { get; set; }
}

Таким образом, Ответ может иметь свойство навигации Критерии , но также может иметь значение null (nullable CriteriaId ).Мои «включения» захватываются так:

public IQueryable<T> List(params string[] includes)
{
  IQueryable<T> source = (IQueryable<T>) this._dbEntitySet;
  if (includes != null)
  {
    foreach (string include in includes)
      source = source.Include<T>(include);
  }
  return source;
}

Я хотел бы сделать что-то вроде:

public IQueryable<T> List(params string[] includes)
{
  IQueryable<T> source = (IQueryable<T>) this._dbEntitySet;
  if (includes != null)
  {
    foreach (string include in includes)
      source = source.IncludeExists(include).Include<T>(include);
  }
  return source;
}

Итак, если я назову свой Список метод, подобный этому:

List("Answers.Formulas");

Это будет работать, потому что у нас всегда есть формулы.Но если я позвоню

List("Answers.Criteria", "Answers.Formulas")

Это выдаст эту ошибку:

"Указанный путь включения недействителен. EntityType 'Piiick.Data.Answer' не объявляетсвойство навигации с именем «Критерии, ответы». "

Проблема в том, что можно обнулять Критерии .Итак, я хотел бы изменить сгенерированный SQL для проверки на нулевые значения, прежде чем пытаться выполнить включение.

Надеюсь, это имеет смысл

1 Ответ

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

Вы вызываете метод неправильно, передавая единственный включаемый путь "Answers.Criteria, Answers.Formulas".Эта строка, разделенная запятыми, не будет проанализирована Entity Framework как два отдельных включения, а будет представлена ​​как один элемент.Вот почему вы получаете сообщение о том, что у вас нет свойства навигации с именем Criteria, Answers, поскольку оно разделяет путь только на ., что дает вам такой путь, который явно не имеет смысла:

"Answers"
  └─ "Criteria, Answers"
    └─ "Formulas"

Вместо этого вам нужно вызвать ваш метод с двумя различными путями, например:

var query = List("Answers.Criteria", "Answers.Formulas");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...