Загрузка связанных данных в Entity Framework Core и ASP. NET Core - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь загрузить связанные данные с Include(), но думаю, что я делаю что-то не так.

Я хочу загрузить изображения обуви в эту таблицу и изображения для практических целей в один ряд , но когда я добавляю ShoeImages.ImageURL (в качестве примера), я получаю ошибку CS1061, и я не могу показать данные с Include().

У меня есть индексная страница:

@model IEnumerable<Shoes.Data.Entities.ShoeEntity>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ShoesImages)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <!--- This is the problem too --->
            <td>
                @Html.DisplayFor(modelItem => item.ShoesImages.ImageURL)
            </td>

            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Контроллер индекса:

public IActionResult Index()
{
     var data = _context.Shoes.Include(ci => ci.ShoeImages);
     return View(data);
}

Shoe объект:

public class ShoeEntity
{
     public string Id { get; set; }
     public string Name { get; set; }
     public ICollection<ShoeImageEntity> ShoeImages { get; set; }
}

Объект ShoeImages:

public class ShoeImageEntity
{
    public string Id { get; set; }
    public string ImageURL { get; set; }

    public string ImageFullPath => 
            string.IsNullOrEmpty(ImageURL) ? null : $"https://localhost:44357{ImageURL.Substring(1)}";

    public ShoeEntity Shoe { get; set; }
}

Класс контекста:

public class DataContext : IdentityDbContext<UserEntity, RoleEntity, string>
{
     public DbSet<ShoeEntity> Shoes{ get; set; }
     public DbSet<ShoeImagesEntity> ShoesImages { get; set; }     

     public DataContext(DbContextOptions options) : base(options)
     {
     }
}

Также я попробовал документацию Entity Framework.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Ваше поле ShoeImages соответствует нескольким полям ImageURL, поскольку оно относится к типу ICollection.

Вы можете использовать следующий код представления для их отображения.

@model IEnumerable<Shoes.Data.Entities.ShoeEntity>
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ShoesImages)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            foreach (var images in item.ShoeImages)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => images.ImageURL)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }

        }
    </tbody>
</table>
0 голосов
/ 04 марта 2020

Спасибо всем за помощь. Если бы я сделал это один, я бы этого не заметил. Я проверяю ответ как правильный. Я сделаю правку, потому что оба foreach требуют @ перед каждым foreach

@model IEnumerable<Shoes.Data.Entities.ShoeEntity>
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ShoesImages)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            @foreach (var images in item.ShoeImages)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => images.ImageURL)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }

        }
    </tbody>
</table>
...