РЕДАКТИРОВАТЬ: изменена пара классов по сравнению с тем, что они указаны ниже, чтобы соответствовать руководству Microsoft по отношениям.
Devices.cs
public partial class Devices
{
public int DeviceType { get; set; }
...
public DeviceTypes DeviceTypes { get; set; }
}
DeviceTypes.cs
public partial class DeviceTypes
{
public int DeviceType { get; set; }
public string Name { get; set; }
public Devices Devices { get; set; }
}
Затем я изменил свое представление, чтобы начать чтение DeviceTypes.Name.
Index.cs html
@Html.DisplayFor(modelItem => item.DeviceTypes.Name)
dbContext.cs
modelBuilder.Entity<Devices>(entity =>
{
entity.HasKey(e => e.DeviceId);
...
entity.Property(e => e.DeviceType).HasComment("ID of the type of devices. Primary key in DeviceTypes table.");
...
entity
.HasOne(p => p.DeviceTypes)
.WithOne(p => p.Devices);
});
....
modelBuilder.Entity<DeviceTypes>(entity =>
{
entity.HasKey(e => e.DeviceType);
entity.HasComment("The types of devices.");
entity.Property(e => e.DeviceType)
.HasComment("Id of the device.")
.ValueGeneratedNever();
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(50)
.HasComment("Name of the device.");
entity
.HasOne(b => b.Devices)
.WithOne(i => i.DeviceTypes)
.HasForeignKey("DeviceType");
});
Я тоже добавил в конструктор моделей, но опять застрял не понимая. Я потратил еще несколько часов на попытки, но не могу понять. Текущая ошибка, которую я получаю:
InvalidOperationException: вы настраиваете связь между «DeviceTypes» и «Devices», но указали внешний ключ в «DeviceType». Внешний ключ должен быть определен для типа, который является частью отношения.
Это вопрос об использовании связанных таблиц в моих редакторах CRUD в. NET Core 3.1. Я хочу использовать имя вместо идентификатора для отображения на страницах index / details / delete. А на страницах создания / редактирования я хочу использовать раскрывающийся список для выбора значения из списка.
Я нашел довольно много примеров, но ничего из того, что я пробовал, пока не сработало. Раньше у меня было слишком много разных идей, смешанных в моем коде, поэтому я отбросил все изменения и пытаюсь снова, но застрял.
Я начинаю с простого добавления своей модели еще раз и пытаюсь просто заставить ее отобразить в мой список с разбивкой на страницы. В настоящее время в страничном списке не отображается никакого значения, а не имя или идентификатор. Очевидно, я пытаюсь отобразить имя. Затем я перейду к чему-то более сложному, например, к получению этого значения в раскрывающемся списке на странице создания.
Я знаю, что не разбираюсь в части связывания данных из базы данных обратно в мою модель представления, но я потратили на это так много часов сегодня и так и не нашли недостающую часть. У меня было так много вариантов, которые не работали, и я пытался начать с того, чтобы сделать это как можно проще, а затем попросить у вас совета.
Вот код, с которым я работаю:
Devices.cs - DeviceType - это действительно идентификатор
public partial class Devices
{
[MaxLength(10)]
public string DeviceId { get; set; }
public int DeviceType { get; set; }
...
[NotMapped]
public DeviceTypes DeviceTypes { get; set; }
}
DeviceTypes.cs - это то, что я хочу найти по DeviceType (int) и использовать имя в редакторах
public partial class DeviceTypes
{
public int DeviceType { get; set; }
public string Name { get; set; }
}
DevicesViewModel.cs
public class DevicesViewModel
{
public Devices Devices { get; set; }
public PaginatedList<Devices> DevicesPagedList { get; set; }
}
DevicesController.cs - это метод индекса, в котором я получаю данные, а затем то, что передаю в свое представление
var devices = from dev in _context.Devices
select dev;
...
return base.View(new DevicesViewModel { DevicesPagedList = await PaginatedList<Devices>.CreateAsync(devices.AsNoTracking(), currentPage, resultsPerPage ?? 10), ResultsPerPageList = SelectListItemHelper.ResultsPerPageList().Where(l => l.Text != (resultsPerPage ?? 10).ToString()) });
}
Наконец, вот где я пытаюсь отобразить значение в Index.cs html
@model DevicesViewModel
...
@foreach (var item in Model.DevicesPagedList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.DeviceTypes.Name)
</td>
...