3

したがって、linq-to-sql dbml ファイルにいくつかのテーブルがあります。

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

1 に答える 1

1

ユーザーの代わりにマップされたオブジェクトを作成し、それにロールの配列を与えます。これは主に、ユーザーのパスワードと生のハッシュを含む生のデータ オブジェクトを返すためです。その後、マッピングでこれらを非表示にすることができます

Roles の子を持つ UserObject と User の子を持つ RolesObject のそれぞれに 1 つのモデルを用意します。

または、疑似オブジェクトを返すそれぞれでシリアル化できるプロパティを用意して、役割を id/string の配列にすることができ、ユーザーも同様にすることができます (次に、関係のシリアル化を無視し、代わりにそれをシリアル化します。循環参照の問題はありません)。

于 2013-10-08T13:32:35.543 に答える