4

我有两张桌子:Users& Profiles。一个用户有一个配置文件 (1:1),一个配置文件可以影响多个用户,每个配置文件有很多模块,每个模块有很多操作。

我使用直接服务调用将此对象从 asmx 发送到 aspx 页面。

由于延迟加载,我得到了一个错误......所以我禁用了延迟加载。

this.Configuration.LazyLoadingEnabled = false;

这很好,我得到了我的用户,配置文件为空。

要构建菜单树,我必须检索配置文件。我包括它:

        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 中(在发送之前)快速查看用户对象时,我发现配置文件已包含拥有此 pofile 的用户列表,每个用户都加载了他的配置文件......等等

请问有什么想法吗?

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

在您的代码中,您通过用第二个查询覆盖它来丢弃第一个查询。并且没有正当理由创建一个空白用户。

为了解决您的问题,您将决定您不想序列化的内容。在您的情况下,您可能不想序列化 Profile.Users

你没有提到你正在使用什么序列化程序。我假设您正在使用 DataContract 序列化程序?

编辑:

您将使用 [IgnoreDataMember] 属性标记您的 Profile.Users 对象。

于 2013-03-14T19:14:49.810 回答