如何使用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()
,但也没有成功。
是因为它使用了一个额外的表来将值存储为Element
s吗?这是我能想到的关于这份清单的唯一具体内容。
我缺少了什么,使此恢复无法工作?
欢迎有任何想法。谢谢
编辑:
Guids列表已正确序列化和反序列化。唯一没有做的是在数据库中插入guids列表,但它存在于反序列化的数据中。
编辑2:
奇怪的是,项目中其他地方的另一段代码也做了同样的事情,这次成功了。因此,它可能是一个模糊的NHibernate配置参数,在两侧都不同,但mainNH.xml.config每次都是同一个文件。
您的保存/更新很可能没有级联到子集合。
将映射更改为
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);