C#entity framework:如何结合模型对象上的.Find和.Include?

我在做mvcmusicstore练习教程。 创build相册pipe理器的脚手架时,我注意到了一些东西(添加删除编辑)。

我想优雅地写代码,所以我正在寻找干净的方式来写这个。

仅供参考我正在使商店更通用:

专辑=项目

stream派=类别

艺术家=品牌

以下是如何检索(由MVC生成)索引:

var items = db.Items.Include(i => i.Category).Include(i => i.Brand); 

以下是如何检索删除项目:

 Item item = db.Items.Find(id); 

第一个带回所有物品,并在物品模型中填充类别和品牌模型。 第二个,没有填充类别和品牌。

我怎么能写第二个find并填充什么里面(最好在1行)…理论上 – 就像:

 Item item = db.Items.Find(id).Include(i => i.Category).Include(i => i.Brand); 

首先需要使用Include() ,然后从结果查询中检索单个对象:

 Item item = db.Items .Include(i => i.Category) .Include(i => i.Brand) .SingleOrDefault(x => x.ItemId == id); 

Dennis的答案是使用IncludeSingleOrDefault 。 后者往返于数据库。

另一种方法是使用FindLoad相结合来显式加载相关的实体。

在MSDN示例下面:

 using (var context = new BloggingContext()) { var post = context.Posts.Find(2); // Load the blog related to a given post context.Entry(post).Reference(p => p.Blog).Load(); // Load the blog related to a given post using a string context.Entry(post).Reference("Blog").Load(); var blog = context.Blogs.Find(1); // Load the posts related to a given blog context.Entry(blog).Collection(p => p.Posts).Load(); // Load the posts related to a given blog // using a string to specify the relationship context.Entry(blog).Collection("Posts").Load(); } 

当然,如果该实体已经被上下文加载,则Find立即返回而不向商店发出请求。

没有为我工作。 但是我这样做就解决了

 var item = db.Items .Include(i => i.Category) .Include(i => i.Brand) .Where(x => x.ItemId == id) .First(); 

不知道这是一个好的解决scheme。 但另一个丹尼斯给了我一个布尔错误.SingleOrDefault(x => x.ItemId = id);