簡體   English   中英

ef7無法檢索子集合的子對象的屬性

[英]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其他屬性。 我不能。 .ThenIncludereg的創建中,因為類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM