【问题标题】:Converting Nhibernate Object to JSON将休眠对象转换为 JSON
【发布时间】:2014-09-14 20:30:43
【问题描述】:

我在转换时收到此错误。

Initializing[Entity.Tag#8] - 无法延迟初始化一个集合 角色:Entity.Tag.Feed,没有会话或会话被关闭

Feed feed = new Feed();

Tag tag = Tag.READ.ById(8);
feed.Tag.Add(tag);
feed.Language = ENLanguage.EN;
feed.Name = "Foo";

feed.Save();

string x = JsonConvert.SerializeObject(feed);

Feed 类

public class Feed : BaseClass<Feed>
{
    public virtual int FeedId { get; set; }
    public virtual IList<Tag> Tag { get; set; }
    public virtual ENLanguage Language { get; set; }
    public virtual string Name { get; set; }

    public Feed()
    {
        Tag = new List<Tag>();
    }

    public virtual void AddTag(Tag tag)
    {
        tag.Feed.Add(this);
        Tag.Add(tag);
    }
}

Feed 地图

public class FeedMap : ClassMap<Feed>
{
    public FeedMap()
    {
        Id(x => x.FeedId);
        HasManyToMany(x => x.Tag).Cascade.All().Table("FeedTag");
        Map(x => x.Language).CustomType<short>();
        Map(x => x.Name);
    }
}

标签类

public class Tag : BaseClass<Tag>
{
    public virtual int TagId { get; set; }
    public virtual IList<Feed> Feed { get; protected set; }
    public virtual string Name { get; set; }
}

标签图

public class TagMap : ClassMap<Tag>
{
    public TagMap()
    {
        Id(x => x.TagId);
        Map(x => x.Name);
        HasManyToMany(x => x.Feed).Cascade.All().Inverse().Table("FeedTag");
    }
}

保存方法

    using (var session = NHibernateHelper.OpenSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(x);

            transaction.Commit();
        }
    }

【问题讨论】:

  • 您的会话在哪里开始和结束?我之前在控制器中加载某些内容时遇到过这个问题,但是当视图尝试对其执行某些操作时,会话已关闭。
  • 我想你是在问保存方法?我添加了问题。
  • 哦!您正在立即关闭会话.....这意味着它以后不能延迟加载内容
  • 我对nhibernate不熟悉,应该怎么做才是正确的?
  • 你在做一个网络应用吗?还是别的什么?

标签: c# json nhibernate fluent-nhibernate json.net


【解决方案1】:

听起来您的会话结束得太快了。您打开它只是为了保存。

试试

using (var session = NHibernateHelper.OpenSession())
{
  Feed feed = new Feed();

  Tag tag = Tag.READ.ById(8);
  feed.Tag.Add(tag);
  feed.Language = ENLanguage.EN;
  feed.Name = "Foo";

  feed.Save();

  string x = JsonConvert.SerializeObject(feed);
}

【讨论】:

  • 如果我只用 using 覆盖 SerializeObject 怎么办?那样有用吗?如果是我打算创建 ToJson 泛型方法来处理其中的 sessin。所以我可以像“feed.ToJson()”一样使用它
  • [JsonIgnore] 解决了我的问题,但我从你们那里学到了一些新东西!赞赏!
【解决方案2】:

我认为你没有初始化惰性集合的问题 从数据库中获取对象时的 IList 类 Tag 提要

Tag.READ.ById(8); // in that method you have to initialize Feed

类似

using(session = NHibernateHelper.OpenSession())
{
var TagObjectFromDb = session.Get<Tag>(id);
NHibernateUtil.Initialize(TagObjectFromDb.Feed);//initialize lazy collection, 
return TagObjectFromDb;
}

Feed fbfeed = new Feed();//fbfeed - typo?

Tag tag = Tag.READ.ById(8);
feed.Tag.Add(tag);//fbfeed - typo?

【讨论】:

  • READ.ById 是一个通用方法。你的建议不合适。有什么办法吗?
  • 当你调用 string x = JsonConvert.SerializeObject(feed);实例馈送必须完全初始化。对于 IList Feed 或 IList Tag 等集合属性,您必须在打开的会话中调用 NHibernateUtil.Initialize()
  • 在您的情况下,我可以想到简单的解决方案,因为您没有打开会话,您可以使用它来初始化集合。或者也许你有,但我在你的例子中看不到。
  • [JsonIgnore] 解决了我的问题,但我从你们那里学到了一些新东西!赞赏!
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2017-06-16
  • 2012-03-20
相关资源
最近更新 更多