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的答案是使用Include
和SingleOrDefault
。 后者往返于数据库。
另一种方法是使用Find
与Load
相结合来显式加载相关的实体。
在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);