3

所以我在 linq-to-sql dbml 文件中有几个表:

我的 dbml 布局

我已经为用户设置了一个 WCF REST 获取端点。我无法让它传回这样的 JSON:

{
    ID: '123',
    Username: 'fdsaf',
    ...
    Role: 
    {
        ID: '123',
        ...
    }
}

如果我将 DBML 序列化模式从“无”设置为“单向”,我可以获得没有角色的用户对象。如果我将序列化模式保留为 none 并删除关联,我还可以获得用户对象。作为健全性检查,我也可以在没有用户的情况下获得角色。一旦我尝试包含引用,它就会尝试序列化两次(在调试器中),并且在客户端上似乎成功调用函数后出现以下错误:

客户端错误

此外,如果我打开关联并将子属性访问权限设置为内部,我可以获得我正在寻找的内容。但是,有时我会希望将角色与用户集合一起传回,所以这还不够。

解决方法不足

我包含这条信息是因为它似乎表明序列化程序正在尝试序列化 User > Role > User > Role ... 等,这显然是不够的。但是在循环和零级深度参考之间必须有一个中间地带。

下面的代码:

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();
}
4

1 回答 1

1

我会创建一个映射对象而不是用户,并给它一个角色数组,主要是因为您要传回一个原始数据对象,其中包括用户的密码和原始哈希。然后您可以将这些隐藏在映射中

每个模型都有一个模型,UserObject 具有 Roles 的孩子,RolesObject 具有 User 的孩子。

或者,有一个属性,您可以对每个返回伪对象进行序列化,因此角色可以是 id/字符串数组,用户也可以(然后您忽略关系上的序列化并对其进行序列化,没有循环引用问题)

于 2013-10-08T13:32:35.543 回答