EF7 doesn't support lazy loading of child objects.Include()
機能をサポートしています。それは、私は何かに苦しんでいて、EF7でそれができないかどうか、あるいはこれをあまりにも長く注視しているのかどうかはわかりません。ef7子コレクションの子オブジェクトのプロパティを取得できません
次のようにと仮定何か()reg.Activities.Task.Ordinal
(int
をチェックするには、タスクは、私が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
できません。クラスRegistration
がTask
プロパティの定義が含まれます(ただしRegistration
List<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; }
}
:美しく見え活動 –
@MihailStancescuマンの含まれた後、.INCLUDE(R => r.Acvitities.Select(トン=> t.Taskを))と、私はそれを解決することを望みましたが、 'reg'変数を作成するときにgetRegistrationで例外をスローしています...'タイプ 'Remotion.Linq.Clauses.Expressions.SubQueryExpression'のオブジェクトをキャストできません 'System.Linq.Expressions.MemberExpression''を入力してください –