我有两个类,有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();
}
}
我流利的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");
}
}
我的控制器
public ActionResult Index()
{
return View(__supportRepository.GetAll());
}
我的观点:
@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>
}
还试图在FileDetail类中配置Fluent API,但仍然存在同样的事情。filedetains的列表在View
中为空返回编辑:
那是我的支持表
支持表
和我的filedetail表:
filedetain表
编辑:
我认为问题是查询,看来查询不是在另一个表中寻找相关数据。我只是不明白为什么
{SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], [Extent1].[Summary] AS [Summary] FROM [dbo].[Support] AS [Extent1]}
由于 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
,进一步的过滤将传递给DB:
return DBset;