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

C# 如何使用Fluent NHibernate映射序列化/反序列化元素列表?,c#,nhibernate,serialization,fluent-nhibernate,fluent-nhibernate-mapping,C#,Nhibernate,Serialization,Fluent Nhibernate,Fluent Nhibernate Mapping,我正在尝试使用Fluent NHibernate映射来序列化/反序列化数据 从一个“根”实体开始,我使用映射构建一个包含所有链接到该实体的实体的图。然后我序列化这组实体 我有这个映射(仅相关部分): [可序列化] 公开课Foo { 公共虚拟IList条{get;set;} 公共虚拟IList GUID{get;set;} } [可序列化] 公共类酒吧 { 公共虚拟Foo Foo{get;set;} } 公共类条形图:类映射 { 引用(x=>x.Foo,“idFoo”).Not.Nullable(

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

从一个“根”实体开始,我使用映射构建一个包含所有链接到该实体的实体的图。然后我序列化这组实体

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

[可序列化]
公开课Foo
{
公共虚拟IList条{get;set;}
公共虚拟IList GUID{get;set;}
}
[可序列化]
公共类酒吧
{
公共虚拟Foo Foo{get;set;}
}
公共类条形图:类映射
{
引用(x=>x.Foo,“idFoo”).Not.Nullable();
}
公共类FooMap:ClassMap
{
有许多(x=>x.bar);
HasMany(x=>x.Guids).Table(“Guids”).KeyColumn(“idFoo”).Element(“guid”).AsBag().Not.LazyLoad();
}
对于Foo和Bar序列化和反序列化,一切都正常工作。但是当试图将反序列化的数据持久化回数据库时,
Guids
列表不会持久化,尽管它的数据可以在Foo对象中找到

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

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

我遗漏了什么阻止了恢复工作

任何想法都欢迎。谢谢

编辑:

GUID列表已正确序列化和反序列化。唯一没有完成的事情是guids列表的DB插入,但是它存在于反序列化的数据中

编辑2:


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

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

将映射更改为

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

尝试在HasMany映射中添加反向(false)。

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

尝试

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

这里似乎有些混乱。Net序列化与(Fluent)NHibernate映射无关。反序列化是否正确发生?也就是说,在反序列化之后,您能看到对象中guid的列表吗?列guid的数据类型是什么?它是使用SchemaExport?在DB中生成的,GUID是
UNIQUEIDENTIFIER
。是的,它是使用SchemaExport生成的。我调试这种情况的一种方法是查看每个排列触发的实际sql。我本希望反向映射能起到作用,好吧,让我在我的盒子里试试。@SrikanthVenugopalan我当然看过生成的SQL。在工作端(EDIT2),插入
Foo
类,然后紧接着插入guid。但是guid的插入并没有发生在欺骗我的部分。没有错误或任何东西。不,这些值仍然不会被持久化。我只是试了一下,但事实上我已经试过了。对不起,我应该提到它。我不能为
Inverse()
方法指定任何参数。无论如何,我尝试了使用和不使用
Inverse()
,得到了相同的结果。我不能这样做,因为我不知道运行时的实体类型。给出的示例只是一个真正简化的映射,只有两个类,但实际上有几十个。只有少数几个类会导致这个问题(每次映射都是一个带有
Element
命令的额外表),但我不能单独处理它们,因为我必须保证将来的类将被正确处理,不管它们的映射配置如何。我仍然没有找到解决问题的方法,因此,我结束了构建漫游。我仍然会为你的努力而奖励你。谢谢
Session.Merge(bar);
Session.Merge(bar.Foo);
Session.SaveUpdate(bar);