2015-12-17 22 views
5

EF7 doesn't support lazy loading of child objects.Include()機能をサポートしています。それは、私は何かに苦しんでいて、EF7でそれができないかどうか、あるいはこれをあまりにも長く注視しているのかどうかはわかりません。ef7子コレクションの子オブジェクトのプロパティを取得できません

次のようにと仮定何か()reg.Activities.Task.Ordinalintをチェックするには、タスクは、私がDBを自分でチェックして、関連レコードが実際に存在している確信していても、常にnullである)...

public void SomeOtherMethod() 
    var r = getRegistration(User.UserName); 
    var act = r.Activities 
     .Where(a => a.IsDone == false) // unfinished 
     .OrderByDescending(o => o.Task.Ordinal) // Task indicates activity type, is always null 
     .FirstOrDefault(); // to get a user's most recent unfinished activity 

    //DO SOMETHING WITH ACT 
} 

public Registration getRegistration(string userName) { 
    var reg = _context.Registrations 
     .Where(r => r.User.UserName == userName) // this works however? 
     .Include(r => r.Acvitities) // List<Activity> 
     .FirstOrDefault(); 

     return reg; 
} 

... navigation propertiesがモデルクラスの適切な場所にありますが、上記の.Taskはnullであり、ロードされていません。

さらに、クエリが投影されているため、の作成では、追加のプロパティをもう.Includeできません。クラスRegistrationTaskプロパティの定義が含まれます(ただしRegistrationList<Activity>をしているActivitiesのコレクションを持っている、とActivityを定義する別のテーブル/クラスに関連しているTaskを持っていないいないので、私はregの作成に.ThenIncludeをカントタスクと彼らはActivityあたりのユーザーに提示する必要があるため。

私はRegistrationオブジェクトを戻しつつActivitiesのそれぞれにTaskに参加することができることを期待して.Join.Include.ThenIncludeの様々な呪文を試してみましたが、このましたRegistrationそれ自体にTaskプロパティは含まれていません。

私はGitHubで新しい問題を作成することを検討しましたが、まだそれほど難しくないとは確信していません。


UPDATE1:
.Include(r => r.Activities.Select(resp => resp.Responses))
ミハイルが使うことを提案
... ...しかし、これは例外を生成します。このSO(https://stackoverflow.com/a/30151601/3246805)は、EF5のそれを示し、.ThenIncludeを使用する必要があります。

しかし、その提案をしようと...
.ThenInclude(r => r.Select(t => t.Task))
...は、次の例外を生成する...

The properties expression 'r => {from Activity t in r select [t].Task}' is not valid. The expression should represent a property access: 't => t.MyProperty'. When specifying multiple properties use an anonymous type: 't => new { t.MyProperty1, t.MyProperty2 }'. 
Parameter name: propertyAccessExpression 



アップデート2:スタッフォードは、スキーマを求めました。共有可能なレポでのベストエフォート...子供の子のプロパティのThenInclude続い

public class RegistrationData { 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    public MyUser User { get; set; } // MyUser : IdentityUser 

    //blah blah, more fields 

    public List<UserTask> Activitys { get; set; } 
} 

public class UserTask { 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Required] 
    public bool IsDone { get; set; } = false; 

    [Required] 
    public int RegistrationId { get; set; } 
    [Required] 
    public RegistrationData Registration { get; set; } 

    [Required] 
    public int TaskId { get; set; } 
    [Required] 
    public Task Task { get; set; } 

    public List<UserResponse> Responses { get; set; } 
} 

public class Task { 
    [Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] // ID comes from loaded config 
    public int Id { get; set; } 

    [StringLength(20, MinimumLength = 1)] 
    public string Name { get; set; } 

    [Required] 
    public int Ordinal { get; set; } 

    [Required] 
    public int GroupId { get; set; } 
} 

public class UserResponse { 
    [Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Required] 
    public int UserTaskId { get; set; } 
    [Required] 
    public int QuestionNumber { get; set; } 
} 
+0

:美しく見え活動 –

+0

@MihailStancescuマンの含まれた後、.INCLUDE(R => r.Acvitities.Select(トン=> t.Taskを))と、私はそれを解決することを望みましたが、 'reg'変数を作成するときにgetRegistrationで例外をスローしています...'タイプ 'Remotion.Linq.Clauses.Expressions.SubQueryExpression'のオブジェクトをキャストできません 'System.Linq.Expressions.MemberExpression''を入力してください –

答えて

12

使用Include。子のプロパティはThenIncludeのインテリセンスでは表示されないかもしれませんが、とにかくそれを入力してください - それはコンパイルされ、期待どおりに動作します。あなたはこのような他の行が必要です

var reg = _context.Registrations 
    .Where(r => r.User.UserName == userName) 
    .Include(r => r.Acvitities).ThenInclude(a => a.Task) 
    .Include(r => r.Activities).ThenInclude(a => a.SomethingElse) 
    .FirstOrDefault(); 
    return reg; 
+0

これは私が必要とするものに非常に近いです!実際には、Taskプロパティの問題を解決します!私は同じコンセプトを使って、オブジェクトのリストである同じオブジェクトから追加のプロパティを集めようとしました。運がない。アイデア? '.ThenInclude'が複数あることができますか?それは実行可能でなければならないようだ、私はちょうどそれをかなり得ていない。 2つ目は、以前のもの(Taskクラス)から外しています。別の 'インクルード(r => r.Acvitities)'もあまり適切ではないようです。 –

+0

@ t.j。複数の '.Include(something).ThenInclude(something)'があります。あなたのスキーマとあなたが含めるべき物件を表示してください。 –

+0

これはそれができることを示唆しています... https://github.com/aspnet/EntityFramework/issues/2274 –

関連する問題