通过可选的导航属性c#EF进行热切加载

时间:2018-10-19 09:29:31

标签: c# entity-framework

我在当前项目中使用紧急加载,在此项目中,我具有可选的导航属性。 这是模型:

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; }
}

因此,答案可以具有 Criteria 导航属性,但也可以为null(可为空的 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 方法:

List("Answers.Formulas");

这将起作用,因为我们总是有公式。 但是如果我打电话

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

它将引发此错误:

  

“指定的包含路径无效。EntityType'Piiick.Data.Answer'未声明名称为'Criteria,Answers'的导航属性。”

问题是可为空的条件。因此,我想在尝试进行包含之前更改生成的SQL以检查是否为空。

我希望这是有道理的

1 个答案:

答案 0 :(得分:1)

您通过传递单个包含路径"Answers.Criteria, Answers.Formulas"来错误地调用该方法。逗号分隔的字符串不会被Entity Framework解析为两个不同的include,而是作为单个项进行解析。这就是为什么出现错误说明您没有名为Criteria, Answers的导航属性的原因,因为它仅将.分隔路径,这给您这样的路径显然是没有意义的:

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

相反,您需要使用两个不同的路径来调用方法,例如:

var query = List("Answers.Criteria", "Answers.Formulas");