如何使用Fluent NHibernate映射序列化/反序列化元素列表

本文关键字:反序列化 元素 列表 序列化 映射 何使用 Fluent NHibernate | 更新日期: 2023-09-27 18:00:11

我正在尝试使用Fluent NHibernate映射来序列化/反序列化数据。

从一个"根"实体开始,我使用映射来构建一个图,其中所有实体都链接到该实体。然后我序列化这组实体。

我有这个映射(只有相关部分):

[Serializable]
public class Foo
{
    public virtual IList<Bar> Bars { get; set;}
    public virtual IList<System.Guid> Guids { get; set; }
}
[Serializable]
public class Bar
{
    public virtual Foo Foo { get; set; }
}
public class BarMap : ClassMap<Bar>
{
    References(x => x.Foo, "idFoo").Not.Nullable();
}
public class FooMap : ClassMap<Foo>
{
    HasMany(x => x.Bars).KeyColumn("idFoo");
    HasMany(x => x.Guids).Table("guids").KeyColumn("idFoo").Element("guid").AsBag().Not.LazyLoad();
}

Foo和Bar的序列化和反序列化一切正常。但是,当试图将反序列化的数据持久化回DB时,Guids列表不会持久化,尽管它的数据在Foo对象中找到。

我在谷歌上搜索了一段时间,但没有发现任何有用的东西。我也尝试过Inverse,但没有成功。我还尝试了Cascade.SaveUpdate(),但也没有成功。

是因为它使用了一个额外的表来将值存储为Elements吗?这是我能想到的关于这份清单的唯一具体内容。

我缺少了什么,使此恢复无法工作?

欢迎有任何想法。谢谢

编辑:

Guids列表已正确序列化和反序列化。唯一没有做的是在数据库中插入guids列表,但它存在于反序列化的数据中。

编辑2:

奇怪的是,项目中其他地方的另一段代码也做了同样的事情,这次成功了。因此,它可能是一个模糊的NHibernate配置参数,在两侧都不同,但mainNH.xml.config每次都是同一个文件。

如何使用Fluent NHibernate映射序列化/反序列化元素列表

您的保存/更新很可能没有级联到子集合。

将映射更改为

  HasMany(x => x.Guids).Cascade.SaveUpdate().Table("guids").KeyColumn("idFoo").Element("guid").AsBag().Not.LazyLoad();

尝试在HasMany映射中添加一个Inverse(false)。

在保存之前尝试刷新会话,并确保保存(而不是SaveOrUpdate)。

尝试

Session.Merge(bar);
Session.Merge(bar.Foo);
Session.SaveUpdate(bar);