bugfix> c# > 投稿

.NET Core 2.0を使用しています

私には3つのモデルがあります:

class ModelA {
    [Key]
    public int ID { get; set; }
    public List<ModelB> Emails { get; set; }
}
class ModelB {
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public int RequestId { get; set; }
    public ModelA Request { get; set; }
    public List<ModelC> Tokens { get; set; }
}
class ModelC {
    [Key]
    public int ID { get; set; }
    public string Token { get; set; }
    public int Status { get; set; }
    public string getStatusName()
    {
        string[] Statuses = new string[] {
            "Created",      // 0
            "Approved",     // 1
            "Rejected"      // 2
        };
        return Statuses[Status];
    }
}

私はこのように作成されたコンテキストも持っています:

public class RequestorContext : DbContext
{
    public DbSet<ModelA> Request { get; set; }
    public DbSet<ModelB> Email { get; set; }
    public DbSet<ModelC> Token { get; set; }
    public RequestorContext(DbContextOptions<RequestorContext> options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
}

今、私はコントローラでそのようなことをしたいと思います:

var request = await _context.Request
                .Include(r => r.Emails) //also include tokens - how ???
                .SingleOrDefaultAsync(r => r.Id == id);

基本的に、対応するトークンを電子メールに含める方法は? ビューでそのようなことを行うには:

@foreach (var email in Model.Emails)
{
    <tr>
        <td>@email.Name</td>
        <td>@email.Token.Token</td>
        <td>@email.Token.getStatusName()</td>
    </tr>
}

現在、私はこのようなエラーが発生しています:

RuntimeBinderException: Cannot perform runtime binding on a null reference CallSite.Target(Closure , CallSite , object ) System.Dynamic.UpdateDelegates.UpdateAndExecute1(CallSite site, T0 arg0) AspNetCore._Views_Requestor_Details_cshtml+d__8.MoveNext() in Details.cshtml + @email.Token.getStatusName()

回答 1 件
  • 関連するデータの複数のレベルをロードするには、 ThenInclude を使用します  ここに文書化されています。

    問題を解決するには、コードは次のようになります。

    var request = await _context.Request
                .Include(r => r.Emails)
                .ThenInclude(e => e.Tokens)
                .SingleOrDefaultAsync(r => r.Id == id);
    
    

あなたの答え