4

私は2つのテーブルを持っています: Users& Profiles. ユーザーには 1 つのプロファイル (1:1) があり、プロファイルは多くのユーザーに影響を与える可能性があり、各プロファイルには多くのモジュールがあり、各モジュールには多くのアクションがあります。

直接サービス呼び出しを使用して、このオブジェクトを asmx から aspx ページに送信しています。

遅延読み込みが原因でエラーが発生したため、遅延読み込みを無効にしました。

this.Configuration.LazyLoadingEnabled = false;

これは正常に機能します。プロファイルが null のユーザーを取得しました。

メニュー ツリーを作成するには、プロファイルを取得する必要があります。私はそれを含めました:

        User user = new User();
        using (cduContext db = new cduContext())
        {
            // get the user
            string encryptedPassword = Encryption.Encrypt(password);
            user = (from u in db.Users
                    where u.UserName.Equals(login) &&
                          u.Password.Equals(encryptedPassword)
                    select u).FirstOrDefault();
            // Include the users profile
            user = db.Users.Include("Profile").FirstOrDefault();
        }
        return user;

JavaScript呼び出し関数でこのエラーが発生しました:

タイプ 'CDU.Entities.Models.User' のオブジェクトをシリアル化中に、循環参照が検出されました。

ユーザーオブジェクトを asmx で(送信する前に)簡単に監視したところ、プロファイルにこのプロファイルを持っているユーザーのリストが含まれていることがわかりました。各ユーザーにはプロファイルが読み込まれています...など

任意のアイデアをお願いします?

4

1 に答える 1

3

コードは次のようになります。

using (cduContext db = new cduContext())
{
    // get the user
    string encryptedPassword = Encryption.Encrypt(password);
    var user = from u in db.Users
               where u.UserName.Equals(login) &&
                     u.Password.Equals(encryptedPassword)
               select u;
    // Include the users profile
    return user.Include("Profile").FirstOrDefault();
}

あなたのコードでは、最初のクエリを 2 番目のクエリで上書きして捨てていました。また、空のユーザーを作成する正当な理由はありませんでした。

この問題に対処するには、シリアライズしたくないものを決定する必要があります。あなたの場合、おそらく Profile.Users をシリアライズしたくないでしょう

使用しているシリアライザーについては言及していません。DataContract シリアライザーを使用していると思いますか?

編集:

Profile.Users オブジェクトを [IgnoreDataMember] 属性でマークします。

于 2013-03-14T19:14:49.810 に答える