В связанной таблице ничего не отображается вместо имени после попытки найти имя из связанной таблицы - PullRequest
0 голосов
/ 21 июня 2020

РЕДАКТИРОВАТЬ: изменена пара классов по сравнению с тем, что они указаны ниже, чтобы соответствовать руководству 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>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...