したがって、linq-to-sql dbml ファイルにいくつかのテーブルがあります。
ユーザーへの WCF REST get エンドポイントを設定しました。次のような構造の JSON を返すことはできません。
{
ID: '123',
Username: 'fdsaf',
...
Role:
{
ID: '123',
...
}
}
DBML シリアル化モードを「なし」から「一方向」に設定すると、ロールなしでユーザー オブジェクトを取得できます。シリアライゼーション モードを none のままにして関連付けを削除すると、ユーザー オブジェクトも取得できます。健全性チェックとして、ユーザーなしでロールを取得することもできます。参照を含めようとするとすぐに、(デバッガーで) 2 回シリアル化が試行され、クライアントでの関数呼び出しが成功したように見えるものの後に、次のエラーが表示されます。
さらに、関連付けを開いて子プロパティへのアクセスを internal にすると、探しているものを取得できます。ただし、ユーザーのコレクションでロールを返したい場合があるため、これでは不十分です。
シリアライザが 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();
}