EF7不支持子对象的延迟加载,但支持该.Include()
功能。话虽这么说,我正在努力寻找一些东西,并且不确定在EF7中是否不可能,或者我只是盯着这个太久了。
假设如下所示(检查reg.Activities.Task.Ordinal
(一个int
),Task始终为空,即使我自己检查数据库并确定实际上存在相关记录也是如此)...
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;
}
...我在模型类中具有导航属性,但是.Task
上面为null且未加载。
此外,由于查询已被投影,因此.Include
在创建时我无法再添加其他属性act
。我不能.ThenInclude
在创作中reg
,因为类Registration
不包括定义的Task
属性(但Registration
确实有一个集合的Activities
是List<Activity>
,和Activity
它有一个Task
是与另一台/类,它定义的任务和应提交的顺序每个用户Activity
。
我尝试了的各种咒语.Join
,.Include
并.ThenInclude
希望能够在返回对象Task
的Activities
同时将它们加入到每个Registration
对象中,但这失败了,因为Registration
它本身不包含Task
属性。
我考虑过在GitHub上创建一个新问题,但不确定它是否可行,我只是没有正确看待。
UPDATE1: Mihail建议使用...
.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
UPDATE2: Stafford要求模式。在可共享仓库中尽最大努力
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; }
}
使用Include
后跟ThenInclude
该子项的子项属性。子属性可能不会在intellisense中显示为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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句