[英]ef7 unable to retrieve child collections' child object's properties
EF7不支持延遲加載子對象 ,但支持.Include()
函數。 話雖這么說,我正在努力解決一些問題,我不確定它是否在EF7中是不可能的,或者我只是盯着這個太久了。
假設類似下面的內容(檢查reg.Activities.Task.Ordinal
(一個int
),Task總是為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;
}
...我在模型類中有導航屬性 ,但是.Task
上面是null並且沒有加載。
此外,由於已經預測了查詢,我不能。在創建act
不再.Include
其他屬性。 我不能。 .ThenInclude
在reg
的創建中,因為類Registration
不包含Task
屬性的定義(但是Registration
確實有一個List<Activity>
的Activities
集合,而Activity
確實有一個與另一個表相關的Task
/定義任務的類,以及每個Activity
應向用戶顯示的順序。
我已經嘗試了.Join
, .Include
和.ThenInclude
各種咒語,希望能夠在返回Registration
對象時將Task
加入到每個Activities
,但是這會因為Registration
本身不包含Task
屬性而失敗。
我考慮在GitHub上創建一個新問題,但我還不確定它是不是很可行而且我只是沒有正確地看待它。
更新1: 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
更新2:斯塔福德要求架構。 在可共享的回購中盡最大努力......
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
。 子屬性可能不會出現在ThenInclude
intellisense中,但只需輸入它 - 它將按預期編譯和操作。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.