Эти 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>
Вот и все.