【发布时间】:2016-05-31 07:06:21
【问题描述】:
我们正在使用类似于下面的实体框架代码为用户提取数据:
using (DataContext db = new DataContext())
{
var users = db.Users.Include("Roles.Role");
}
这有效地获取了我们正在寻找的角色和登录名。但是,由于 Role 上还为该角色中的用户提供了用户,因此它也会被填充。这意味着我们得到的结果类似于以下内容:
[{
"roles" : [{
"userId" : 1,
"roleId" : 1,
"role" : {
"users" : [{
"userId" : 4,
"user" : {
"roles" : [],
"firstName" : "Jill",
"lastName" : "Doe",
"id" : 4
},
"roleId" : 1
}, {
"userId" : 1,
"user" : {
"roles" : [],
"firstName" : "John",
"lastName" : "Doe",
"id" : 1
},
"roleId" : 1
}
],
"id" : 1,
"name" : "Administrator"
}
}
],
"firstName" : "John"
"lastName" : "Doe"
"id" : 1
}]
我们没有明确要求加载角色上的用户,但它似乎正在加载他们,因为它已经知道他们是谁,因为它加载了用户作为主请求的一部分。
我们禁用了延迟加载,并且没有任何属性标记为虚拟。
有没有办法阻止它这样做?我做了一些搜索,大多数人都在问如何让子对象填充,而不是如何在没有请求时阻止它们填充。
更新:为了进一步解释,这发生在 ASP.NET 进行任何类型的序列化之前,它来自数据上下文之后,当对象从 WebAPI 序列化时,我们没有得到任何引用循环。
【问题讨论】:
-
尤其是this answer。
-
我不认为这是重复的。这发生在从数据上下文加载实体之后和任何序列化发生之前。当它序列化时,我们也没有得到任何类型的引用循环,因为它似乎会一次又一次地停止引用自己,正如您在用户最深层的角色中看到的那样是空的。
-
如果您序列化
db.Users.Include("Roles.Role"),使用参考答案中的方法,即使加载了实体,它也不应该序列化Role.Users。
标签: c# entity-framework asp.net-web-api entity-framework-6