Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq to sql赢得';不序列化引用_C#_.net_Wcf_Linq To Sql_Dbml - Fatal编程技术网

C# linq to sql赢得';不序列化引用

C# linq to sql赢得';不序列化引用,c#,.net,wcf,linq-to-sql,dbml,C#,.net,Wcf,Linq To Sql,Dbml,因此,我在linq to sql dbml文件中有两个表: 我已经为用户设置了一个WCF REST get端点。我无法让它传回这样的JSON结构: { ID: '123', Username: 'fdsaf', ... Role: { ID: '123', ... } } 如果我将DBML序列化模式从“None”设置为“单向”,则可以在不使用角色的情况下获取用户对象。如果我将序列化模式保留为“无”并删除关联,则

因此,我在linq to sql dbml文件中有两个表:

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

{
    ID: '123',
    Username: 'fdsaf',
    ...
    Role: 
    {
        ID: '123',
        ...
    }
}
如果我将DBML序列化模式从“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();
}
使用(DataContext=newdatacontext())
{
DataLoadOptions opts=新的DataLoadOptions();
opts.LoadWith(u=>u.Role);
context.LoadOptions=opts;
返回context.Users
.其中(u=>u.ID==ID)
.Where(u=>u.Hash==Hash)
.FirstOrDefault();
}

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

每个都有一个模型, 具有角色子级和 具有用户子级的RoleObject

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

这种方法不适用于JSON。但这几乎使使用linq to sql变得毫无用处。不是真的,您正在查询一个关系数据库,如果您想序列化所有内容,它将为您提供循环引用。由于文档类型的性质,xml不能有循环引用,因此您必须在传递项的方式上有所创新,以包含子项,这些子项必须是孤立的,除非您序列化一个没有关系信息的不同项,否则您的对象将有到层次结构的链接,并抛出一个不稳定的EntityFramework也会这样做,事实上,我很确定几乎所有的ORM都会。这不是图书馆特有的问题。SOAPSQL也有同样的问题,需要一个专门的序列化对象来实现这一点(可以很好地保留ID,但序列化对象不能像当前处理用户/角色那样包含对父对象的引用)。Linq2SQL可以向父/子对象添加属性以不序列化项,但我不知道。断开连接的映射类允许您避免暴露敏感项以及控制每个集合的暴露关系,您将返回链接的非活动角色。简单地说。。。您不会使用linq to sql来序列化对象,因为它是一个查询工具。我只是希望在非常明显的用例中,避免循环引用的简单逻辑会包含在默认的json序列化程序中:序列化此子对象时,不要包含对此父对象的引用。JSON.net包含此逻辑,但我不知道如何指示WCF使用JSON.net作为默认序列化程序。您将默认端点行为设置为JSON。这里有一个例子: