我有一个 EF 查询,通过唯一标识符返回一个“项目(Item)”。我正在使用 MVC 提供的脚手架控制器,这可以正常工作,但现在我想它返回属于该项目的标签列表。
我认为我可以像下面展示的那样使用“Include”来预先获取这些标签。然而,当使用异步时似乎不允许这样做。
Item item = await db.Items.Include("Tags").FindAsync(id);
有人能解释一下为什么这样不起作用,并提供一种替代方法来恢复该项的标签吗?
谢谢
Ben
我有一个 EF 查询,通过唯一标识符返回一个“项目(Item)”。我正在使用 MVC 提供的脚手架控制器,这可以正常工作,但现在我想它返回属于该项目的标签列表。
我认为我可以像下面展示的那样使用“Include”来预先获取这些标签。然而,当使用异步时似乎不允许这样做。
Item item = await db.Items.Include("Tags").FindAsync(id);
有人能解释一下为什么这样不起作用,并提供一种替代方法来恢复该项的标签吗?
谢谢
Ben
Find()
和FindAsync()
是DbSet
类型的方法(这也是db.Items
所表示的类型)。Include()
返回一个DbQuery
对象,这就是为什么不可用FindAsync()
。使用SingleOrDefaultAsync()
来完成与FindAsync()
相同的操作。(区别在于它直接访问数据库,而不会先在上下文中查找实体是否存在)...
Item item = await db.Items.Include("Tags").SingleOrDefaultAsync(i => i.Id == id);
在@Anthony和@Korayem的回答之后,我建议按照以下方式编写更安全的代码。
Item item = await db.Items.Include(o => o.Tags).FirstOrDefaultAsync(i => i.Id == id);
if(item == default(Item))
return NotFound();