gpt4 book ai didi

c# - EF7 MVC6 的实体关系

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:10 26 4
gpt4 key购买 nike

我的目标是使用 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>
}
....

最佳答案

看看ICollection Vs List in Entity Framework .我有一种使用 List<> 的 EF7 小示例的感觉只是不正​​确(很难想象使用 EF7 时,最佳做法会从 ICollection<> 更改为 List<>,将具体集合类型公开为属性通常是非常糟糕的做法。)

根据您的评论我会更改:

创建 View 模型

public class IndexViewModel
{
public IEnumerable<ShelveModel> Shelves { get; set; }
}

public class ShelveModel
{
public string Name { get; set; }
public int BookCount { get ; set; }
}

更新逻辑

// GET: Shelves
public async Task<IActionResult> Index()
{
var model = new IndexViewModel();
model.Shelves = db.Shelves
.Select(s => new
{
Name = s.Name,
BookCount = s.Books.Count()
})
.ToListAsync()
.Select(s => new ShelveModel()
{
Name = s.Name,
BookCount = s.Books.Count()
})
.ToList();

return View(model);
}

关于c# - EF7 MVC6 的实体关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28399099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com