【发布时间】:2018-09-07 11:29:24
【问题描述】:
这是我的模型的简化版本:
public class User {
public int UserID { get; set; }
public string FirstName { get; set; }
public virtual ICollection<Recipe> Recipes { get; set; }
}
public class Recipe {
public int RecipeID { get; set; }
public string RecipeName { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
}
我有一个控制器,我想返回一个用户以及一些关于他们的食谱的摘要信息。脚手架控制器代码如下所示:
var user = await _context.Users.SingleOrDefaultAsync(m => m.UserID == id);
它工作正常。现在我尝试添加食谱,但它会中断:
var user = await _context.Users.Include(u => u.Recipes).SingleOrDefaultAsync(m => m.UserID == id);
我的网络浏览器开始呈现 JSON,它闪烁,我在浏览器中收到一条消息,说连接已重置。
我的理论 - 我相信父(用户)呈现,它暴露了包含对父(用户)的引用的子(食谱),其中包含子(食谱)的集合) 等等导致无限循环。这就是我认为会发生这种情况的原因:
- Visual Studio 调试器允许我以这种方式无限地导航属性。
- 如果我注释掉 Recipe.User 属性,它可以正常工作。
我尝试过的 我尝试使用实体框架投影仅包含来自我需要的Recipe 数据(我试图不包含Recipe.User)。我试图只包含 Recipe.RecipeName... 但是当我尝试使用投影来创建这样的匿名类型时:
var user = await _context.Users.Include(u => u.Recipes.Select(r => new { r.RecipeName })).SingleOrDefaultAsync(m => m.UserID == id);
我收到此错误:
InvalidOperationException:属性表达式 'u => {from Recipe r in u.Recipes select new f__AnonymousType1`1(RecipeName = [r].RecipeName)}' 无效。该表达式应表示属性访问:'t => t.MyProperty'。
解决办法是什么?我可以使用不同的语法进行投影吗?我是不是搞错了?
【问题讨论】:
-
我之前的回答可能会帮助您:stackoverflow.com/a/47451134/1220550
标签: entity-framework asp.net-web-api asp.net-web-api2 asp.net-core-webapi