【问题标题】:Entity framework - Avoid circular Relationship in serialization实体框架 - 避免序列化中的循环关系
【发布时间】:2013-03-14 17:26:57
【问题描述】:

我有两张桌子: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 的用户列表,每个用户都加载了他的配置文件......等等

有什么想法吗?

【问题讨论】:

  • Json 序列化你用什么? JSON.NET?
  • 你为什么要做一个查询,然后用另一个查询覆盖它而不对第一个查询做任何事情?

标签: entity-framework serialization entity-framework-5 wcf-data-services entity-relationship


【解决方案1】:

请注意,您的代码应如下所示:

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 对象。

【讨论】:

  • 您好,是的,它是一个 DataContract 序列化程序,我想根据需要添加“子对象”:在这里,我必须获取一个用户对象,即他的个人资料,但个人资料中没有用户。
猜你喜欢
  • 2011-05-25
  • 2012-04-21
  • 2019-08-09
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多