Как я могу читать и отображать связанные данные в asp.net mvc-core? - PullRequest
0 голосов
/ 12 декабря 2018

В качестве примера, на котором я могу построить, я хочу использовать Teams.ClubNo, чтобы найти Club.ClubNo и добавить Club.ClubName на страницу указателя команд.

Звучит просто, но я еще не нашел ничего, что работает.

Фильтр (который мне нравится) сбивает с толку то, что мне нужно сделать в контроллере.Прямая навигация в базе данных отсутствует.Я использую EF 2.1

Часть _context.Club и _context.Teams

public partial class Club
{
    public Club()
    public short ClubNo { get; set; }
    public string ClubName { get; set; }
}

public partial class Teams
{
    public Teams()
    public string Division { get; set; }
    public string Grade { get; set; }
    public short HomeGround { get; set; }
    public short ClubNo { get; set; }
}

Часть моего TeamsController.cs для отображения моей страницы индекса.

public class TeamsController : Controller
{
    private readonly SSFA_SQLContext _context;

    public TeamsController(SSFA_SQLContext context)
    {
        _context = context;
    }

    // GET: Teams
    public async Task<IActionResult> Index(string filter, string filter1, string filter2, int page = 1, string sortExpression = "Division")
    {
        var qry = _context.Teams.AsNoTracking().AsQueryable();

        if (!string.IsNullOrWhiteSpace(filter))
            { qry = qry.Where(p => p.Division.Contains(filter)); }

        var model = await PagingList.CreateAsync(qry, 15, page, sortExpression, "Division");
        model.RouteValue = new RouteValueDictionary  { "filter", filter } ;

        return View(model);
    }

Частьмоей страницы указателей команд.

<table class="table">
<thead>
    <tr>
        <td>
            @Html.DisplayNameFor(model => model.Division)
        </td>
        <td>
            @Html.DisplayNameFor(model => model.Grade)
        </td>
        <th>
            @Html.DisplayNameFor(model => model.ClubNo)
        </th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Division)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Grade)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ClubNo)
            </td>

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Эти 2 документа были очень полезными.

https://docs.microsoft.com/en-us/ef/core/modeling/relationships

https://docs.microsoft.com/en-us/aspnet/core/data/ef-rp/read-related-data?view=aspnetcore-2.2&tabs=visual-studio

Это предназначено в качестве образца для построения других требований связанных данных.

Часть моих моделей для Club.cs, Ground.cs и Teams.cs

public partial class Club
{
    public Club()
    public short ClubNo { get; set; }
    public string ClubName { get; set; }
    public string PhoneNo { get; set; }
}

public partial class Ground
{
    public Ground()
    public short GroundNo { get; set; }
    public string GroundName { get; set; }
    public string Address { get; set; }
}

public partial class Teams
{
    public Teams()
    public string Division { get; set; }
    public string Grade { get; set; }
    public short HomeGround { get; set; }
    public short ClubNo { get; set; }
}

Часть моего TeamsController.cs для отображения моей индексной страницы.открытый класс TeamsController: Controller {private readonly SSFA_SQLContext _context;

public TeamsController(SSFA_SQLContext context)
{
    _context = context;
}

// GET: Teams
public async Task<IActionResult> Index(string filter, int page = 1, string sortExpression = "Division")
{
    var qry = _context.Teams
        .AsNoTracking()
        .AsQueryable();

    if (!string.IsNullOrWhiteSpace(filter))
        { qry = qry.Where(p => p.Division.Contains(filter)); }

    var model = await PagingList.CreateAsync(qry, 15, page, sortExpression, "Division");
    model.RouteValue = new RouteValueDictionary  { "filter", filter } ;

    return View(model);
}

Объект предназначен для отображения ClubName и GroundName на странице индекса команд .

Решение: (Скорее всего, это один из многих возможных способов сделать это).

Добавить следующее в файл context.cs команд: (Никаких изменений не требуется для файлов контекста Club или Ground)

 entity.HasOne(q => q.ClubNavigation);
 entity.HasOne(q => q.GroundNavigation);

Добавить следующее в файл модели Teams.cs: (Не требуется никаких изменений в файлах модели Club или Ground)

public Club ClubNavigation { get; set; }
public Ground GroundNavigation { get; set; }

Добавить [ForeignKey ("GroundNavigation")] выше

public short HomeGround { get; set; }

(Это необходимо, поскольку HomeGround должен найти GroundNo)

Добавить [ForeignKey ("ClubNavigation")] выше

public short ClubNo { get; set; }

Поскольку ClubNo одинаково в обоих файлах, второй внешний ключ не являетсянеобходимо, но я думаю, что это хорошо для согласованности.

В TeamsController.cs изменить

var qry = _context.Teams
            .AsNoTracking()
            .AsQueryable();

На

var qry = _context.Teams
            .Include(q => q.ClubNavigation)
            .Include(q => q.GroundNavigation)
            .AsNoTracking()
            .AsQueryable();

Добавить следующее в индексный файл команд:

<th>@Html.DisplayNameFor(model => model.HomeGround)</th>
<td><b>@Html.DisplayNameFor(model => model.GroundNavigation.GroundName)</b></td>
<th>@Html.DisplayNameFor(model => model.ClubNo)</th>
<td><b>@Html.DisplayNameFor(model => model.ClubNavigation.ClubName)</b></td>

И

<td>@Html.DisplayFor(modelItem => item.HomeGround)</td>
<td>@Html.DisplayFor(modelItem => item.GroundNavigation.GroundName)</td>
<td>@Html.DisplayFor(modelItem => item.ClubNo)</td>
<td>@Html.DisplayFor(modelItem => item.ClubNavigation.ClubName)</td>

Вот и все.

0 голосов
/ 13 декабря 2018

Поскольку между Club и Teams нет navigation property, необходимо запросить ClubName на основе ClubNo.И поскольку в Teams нет ClubName, вам нужно определить новую модель, которая содержит Clubname.

TeamsVM.cs

public partial class TeamsVM
{
    public string Division { get; set; }
    public string Grade { get; set; }
    public string ClubName { get; set; }
}

И измените запрос, как показано ниже:

public async Task<IActionResult> Index1(string filter, string filter1, string filter2, int page = 1, string sortExpression = "Division")
{
    var qry = _applicationDbContext.Teams.AsNoTracking().AsQueryable();

    if (!string.IsNullOrWhiteSpace(filter))
    { qry = qry.Where(p => p.Division.Contains(filter)); }
    var result = qry.Select(q => new TeamsVM
    {
        Division = q.Division,
        Grade = q.Grade,
        ClubName = _applicationDbContext.Club.FirstOrDefault(c => c.ClubNo == q.ClubNo).ClubName
    });
    var model = await PagingList.CreateAsync(result, 15, page, sortExpression, "Division");
    model.RouteValue = new RouteValueDictionary { "filter", filter };
    return Ok(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...