【发布时间】:2025-11-27 22:50:01
【问题描述】:
我的目标是使用 EF7 和 MVC6 [BETA2] 列出书架的数量和每个书架上的书籍数量。
使用正确的表关系正确创建了数据库架构。我可以成功地将书架和书籍添加到数据库中,包括外键关系(见下面的代码)。
当我测试应该在每个书架上显示图书计数的索引页面时,我没有收到图书计数数据,也没有错误。在 Shelf 实体中,Books 属性仍然没有被 Book 实体填充,因此计数为空(参见下面的代码)。
在 EF7 中是否有我需要编写代码来填充 Shelf.Books 的地方,或者这是否应该在 EF7 中自动发生?
BookShelf.cs
namespace MyApp.Models
{
public class Shelf
{
public int ShelfId { get; set; }
public string Name { get; set; }
public virtual List<Books> Books { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Name { get; set; }
public int ShelfId { get; set; }
public Shelf Shelf{ get; set; }
}
}
ApplicationDbContext.cs
namespace MyApp
{
public class ApplicationDBContext
{
public DbSet<Shelf> Shelf { get; set; }
public DbSet<Book> Book { get; set; }
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Shelf>().Key(s => s.ShelfId);
builder.Entity<Book>().Key(b => b.BookId);
builder.Entity<Shelf>()
.OneToMany(s => s.Book)
.ForeignKey(k => k.ShelfId);
base.OnModelCreating(builder);
}
}
ShelfController.cs
namespace MyApp
{
private ApplicationDBContext db;
public BuildingsController(ApplicationDBContext context)
{
db = context;
}
// GET: Shelves
public async Task<IActionResult> Index()
{
return View(await db.Shelves.ToListAsync());
}
}
Index.cshtml
...
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Books.Count)
</td>
</tr>
}
....
【问题讨论】:
-
可能是因为
db.Shelves.ToListAysnc()创建了一个在控制器范围之外使用的 Shelves 列表,因此永远不会填充Books。其次,除非从 6.1 开始发生变化,否则您的Books属性应该是ICollection<Book>。最后,您应该创建一个实际表示视图所需数据的视图模型,而不是依赖视图中的方法来执行逻辑(例如计数,这很可能是这不起作用的原因)。 -
感谢@ErikPhilips!
-
ICollection<Book>在 EF7 中已更改为List<Book>。从您的 cmets 我不确定您是否说它没有填充是因为我没有使用视图模型或因为db.Shelves.ToListAsync()超出范围。您建议如何更改?
标签: c# asp.net-core entity-framework-core