C # EntityFramework Включить ссылку и ее ссылки, как? - PullRequest
0 голосов
/ 25 мая 2018

Я использую .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: Невозможно выполнить привязку во время выполнения для пустой ссылки CallSite.Target (Closure, CallSite, object) System.Dynamic.UpdateDelegates.UpdateAndExecute1 (Сайт CallSite, T0 arg0) AspNetCore._Views_Requestor_Details_cshtml + d__8.MoveNext () в Details.cshtml + @ email.Token.getStatusName ()

1 Ответ

0 голосов
/ 25 мая 2018

Для загрузки нескольких уровней связанных данных используйте ThenInclude как задокументировано здесь .

Для решения вашей проблемы ваш код будет выглядеть следующим образом:

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