4

我正在尝试使用 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 的序列化和反序列化一切正常。但是当试图将反序列化的数据持久化回数据库时,Guids列表不会持久化,尽管它的数据是在 Foo 对象中找到的。

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

是因为它使用额外的表将值存储为Elements 吗?这是我能想到的关于这个列表的唯一特殊性。

我错过了什么阻止这种恢复工作?

欢迎任何想法。谢谢。

编辑:

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

编辑2:

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

4

4 回答 4

1

尝试将 Inverse(false) 添加到您的 HasMany 映射中。

于 2013-02-25T11:05:03.370 回答
1

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

将您的映射更改为

  HasMany(x => x.Guids).Cascade.SaveUpdate().Table("guids").KeyColumn("idFoo").Element("guid").AsBag().Not.LazyLoad();
于 2013-02-25T10:40:00.770 回答
1

尝试

Session.Merge(bar);
Session.Merge(bar.Foo);
Session.SaveUpdate(bar);
于 2013-02-26T01:05:24.637 回答
1

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

于 2013-02-25T11:06:40.717 回答