所以我在linq-to-sql dbml文件中有几个表:
我已经为用户设置了WCF REST get端点。我不能让它传回一个像这样结构的JSON:
{
ID: '123',
Username: 'fdsaf',
...
Role:
{
ID: '123',
...
}
}
如果我将DBML序列化模式从“None”设置为“Unidirectional”,我可以获得没有角色的用户对象。如果我将序列化模式保留为none并删除关联,我也可以获取用户对象。作为一个完整性检查,我也可以在没有用户的情况下获得该角色。一旦我尝试包含一个引用,它会尝试序列化两次(在调试器中),并且在客户端上看起来成功的函数调用后出现以下错误:
此外,如果我打开关联并将子属性访问权限转到内部,我可以获取我正在寻找的内容。但是,我有时会希望将用户集合传回角色,因此这还不够。
我包含这条信息,因为它似乎表明序列化程序正在尝试序列化用户>角色>用户>角色......等,这显然是不够的。但是,在圆形和零级深度参考之间必须有一个中间点。
以下代码:
using (DataContext context = new DataContext())
{
DataLoadOptions opts = new DataLoadOptions();
opts.LoadWith<User>(u => u.Role);
context.LoadOptions = opts;
return context.Users
.Where(u => u.ID == id)
.Where(u => u.Hash == hash)
.FirstOrDefault();
}
答案 0 :(得分:1)
我会创建一个映射对象而不是用户并给它一个角色数组,主要是因为你传回一个包含用户密码和原始哈希的原始数据对象。然后,您可以在映射中隐藏这些
每个都有一个型号, 具有Roles和a的子项的UserObject 带有User用户的RolesObject。
或者,有一个属性可以序列化每个将返回伪对象的属性 所以角色可以是一个id / strings数组,因此用户也可以(然后你忽略关系的序列化并反而序列化,没有循环引用问题)