2017-12-29 27 views
2

私は、このクラスがあります。自動的にEFコアにコレクションプロパティを含めるものは何ですか?

public class Subject 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    [StringLength(50)] 
    public string Code { get; set; } 

    public int LevelId { get; set; } 
    public int? ParentId { get; set; } 
    public int Order { get; set; } 

    [ForeignKey("LevelId")] 
    public Level Level { get; set; } 

    [ForeignKey("ParentId")] 
    public Subject Parent { get; set; } 

    public ICollection<Subject> Children { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime? DeletedAt { get; set; } 
} 

をそして、私はこれらの2つのリポジトリのメソッドしている:あなたはこれらの2つの方法のためのLINQ文を見れば、彼らは同じだけの別の変数名

public Subject GetById(int subjectId) 
{ 
    var subjectFound = _context.Subjects.Where(subj => subj.Id == subjectId) 
     .SingleOrDefault(); 
    var subject = _mapper.Map<Subject>(subjectFound); 
    if (subjectFound != null) 
    { 
     subject.Children = GetChildren(subject.Id).ToList(); 
    } 
    return subject; 
} 

public void Update(Subject existingSubject) 
{ 
    var subjectToUpdate = _context.Subjects.Where(subj => subj.Id == existingSubject.Id) 
     .SingleOrDefault(); 
    if (subjectToUpdate != null) 
    { 
     _mapper.Map(existingSubject, subjectToUpdate); 
     _context.Update(subjectToUpdate); 

     SaveChildren(subjectToUpdate.Id, existingSubject.LevelId, existingSubject.Children); 

     _context.SaveChanges(); 
    } 
} 

をしていますwhere句では検索されているのと同じ値を持っています。

最初のメソッド(GetById)には、LINQクエリの後で、子がnullであるため、その内部にGetChildren呼び出しがある理由があります。

ただし、2番目のメソッド(Update)では、LINQクエリの後に返されるオブジェクトにはすべて子があります。それらは同じクエリであり、私は同じ値を持っていることを確認するために何度も何度もチェックしています。

私はこれらの呼び出しの前に特別な事前コードはありません。彼らはちょうど正常に呼ばれています。だから私はこの行動によって本当に混乱している。これを引き起こす原因は何ですか?

答えて

2

最初に、EFコア決してには関連するエンティティが自動的に含まれます。 EFコアは遅延ロードをサポートしていないので、関連するエンティティはすべて熱心にロードするか(Include経由)、明示的にロードする(Load)必要があります。

つまり、EFのDbContextはオブジェクトグラフを維持し、オブジェクトが照会されると、そのグラフに永続化されます。子どもたちが一度に読み込んだら、EFはDBから照会することなく、関連する実体をグラフから再構築することができます。しかし、これはあなたが頼りにするべきことではありません。あなたは本質的にちょうど、このメソッドが特定の順序で呼び出されたことに幸運を得ました。物事はそこには存在しないと想定し、それに応じて行動することが常に最善です。 EFがそれを実現するために実際にクエリを発行する必要がない場合、素晴らしいですが、必要に応じて権限を与えられるべきです。

関連する問題