将nHibernate查询序列化为JSON

时间:2010-11-17 16:51:50

标签: c# json fluent-nhibernate

在深入研究Fluent nHibernate时,我发现了使用它的潜在破坏者......

给出以下POCO代码。

public class Customer
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Details Details { get; set; }
}

public class Details
{
  public virtual int Id { get; set; }
  public virtual IList<Orders> Orders { get; set; }
}

public class CustomerMap : ClassMap<Customer>
{
 // perform mapping
}
public class DetailsMap : ClassMap<Details>
{
 // perform mapping
}

我加载了ASP.NET MVC并试图使用Json Serialization。

using System.Web.Script.Serialization;

    public static partial class JsonExtensions
    {
        public static string ToJson(this object item)
        {
            return new JavaScriptSerializer().Serialize(item);
        }
    }

而且,当我从nHibernate上下文传递查询到ToJson方法时,我收到了错误!

  

在序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用。

无论是拉一个对象,还是一个对象列表,它似乎都是这样做的。我甚至尝试将我的课程标记为[Serializable],结果相同。使用Microsoft Entity Framework Code-Only方法的完全相同的类不会发生这种情况。

我可以不将nHibernate DTO反序列化为JSON吗?

添加更多代码供审查。

        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var customers= session.CreateCriteria(typeof(Customer)).List<Customer>();

                foreach (var customer in customers)
                {
                    Console.WriteLine(customer.ToJson());
                }
                Console.ReadLine();
            }
        }

1 个答案:

答案 0 :(得分:2)

这只是一种预感,但您可能想研究它实际上尝试序列化的类型 - nHibernate在运行时为每个POCO生成代理(因此它可以执行诸如延迟加载外键实体之类的内容等)。这可能是您收到此错误的原因。

尝试指定要序列化的确切类型,或者创建一个全新的对象来序列化,用nHibernate POCO填充其属性。

编辑: 这似乎更能解决你的问题:

http://www.west-wind.com/WebLog/posts/147218.aspx

基本上,检查所有POCO是否有任何循环引用(例如,订单POCO作为财产的客户POCO,而订单POCO有客户列表作为财产)