linq-to-sql不会序列化引用

时间:2013-10-04 19:00:33

标签: c# .net wcf linq-to-sql dbml

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

my dbml layout

我已经为用户设置了WCF REST get端点。我不能让它传回一个像这样结构的JSON:

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

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

client error

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

insufficient workaround

我包含这条信息,因为它似乎表明序列化程序正在尝试序列化用户>角色>用户>角色......等,这显然是不够的。但是,在圆形和零级深度参考之间必须有一个中间点。

以下代码:

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

1 个答案:

答案 0 :(得分:1)

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

每个都有一个型号, 具有Roles和a的子项的UserObject 带有User用户的RolesObject。

或者,有一个属性可以序列化每个将返回伪对象的属性 所以角色可以是一个id / strings数组,因此用户也可以(然后你忽略关系的序列化并反而序列化,没有循环引用问题)