簡體   English   中英

將Nhibernate對象轉換為JSON

[英]Converting Nhibernate Object to JSON

轉換時出現此錯誤。

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

飼料分類

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

資訊提供地圖

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

聽起來您的會話結束得太快了。 您僅打開它進行保存。

嘗試

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

我認為您的問題是,當您從數據庫中獲取對象時,您不初始化類Tag的惰性集合IList Feed

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?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM