ASP.NET MVC - платформа Entity Framework Lazing Loading не извлекает данные из связанных классов, используя свободный API - PullRequest
0 голосов
/ 21 марта 2019

У меня есть два класса с отношением 1 ко многим, но при попытке получить список объектов, связанных с классом поддержки, этот список становится пустым.

public class Support
   {
       public int SupportId { get; set; }
       public string Name { get; set; }
       public string Summary { get; set; } 
       public virtual ICollection<FileDetail> FileDetails { get; set; }     
   }

public class FileDetail
   {
       public Guid Id { get; set; }
       public string FileName { get; set; }
       public string Extension { get; set; }
       public int SupportId { get; set; }
       public virtual Support Support { get; set; } 
   }

Мой репозиторий:

  public abstract class Repository<TEntity> : IRepositoryRead<TEntity>, IRepositoryWrite<TEntity> where 
    TEntity : Entity, new()
{

     public virtual IEnumerable<TEntity> GetAll()
    {
        return Dbset.ToList();
    }

}

My Fluent API config

public class FileDetailConfig : EntityTypeConfiguration<FileDetail>
{
    public FileDetailConfig()
    {
        HasKey(c => c.Id);

        Property(c => c.FileName);

        Property(c => c.Extension);

        HasRequired(c =>c.Support )
            .WithMany(c => c.FileDetails )
            .HasForeignKey(c => c.SupportId );


        ToTable("Support");
    }

}

My Controller

   public ActionResult Index()
    {
        return View(__supportRepository.GetAll());
    }

My View:

@foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Summary)
            </td>
            <td>
                @if (item.FileDetails.Count() == 0)
                {
                    <span>No File</span>
                }
                else
                {
                    <span>@item.FileDetails.Count() File(s)</span>
                }
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                <a href="javascript:void(0);" data-id="@item.Id" class="deleteItem">Delete</a>
            </td>
        </tr>
    }

также пытался настроить свободный APIв классе FileDetail, но остается то же самое.Список пустых файлов возвращается в поле зрения

РЕДАКТИРОВАТЬ:

Это моя таблица поддержки

Таблица поддержки

И моя таблица FileDetail:

FileDetain Table

РЕДАКТИРОВАТЬ:

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

{SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], [Extent1].[Summary] AS [Summary] FROM [dbo].[Support] AS [Extent1]}

1 Ответ

0 голосов
/ 21 марта 2019

Поскольку FileDetails равно virtual, я почти уверен, что он будет загружен с отложенным доступом.Так что это не будет в начальном запросе.

Я не понимаю это отображение:

HasRequired(c =>c.Support)
            .WithMany(c => c.FileDetails)
            .HasForeignKey(c => c.SupportId)

Я не вижу свойства Support в вашей модели, вы можете изменить егопросто:

HasMany(c => c.FileDetails).HasForiegnKey(c => c.SupportId);

И посмотрите, что вы получите?

Вы также можете попробовать Include в своем запросе (при условии, что вы не звоните ToList(), см. ниже):

return DBset.Include(x => x.FileDetails);

Другое дело, это загрузит всю таблицу в память:

return Dbset.ToList();

Я бы настоятельно рекомендовал просто вернуть DBSet вместо этого, дальнейшая фильтрация получитпередано в БД:

return DBset;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...