如何序列化/反序列化引用其他对象的NHibernate实体?

时间:2010-05-07 04:21:18

标签: nhibernate serialization orm entity-relationship object-graph

我有两个NHibernate管理的实体,它们具有双向的一对多关系:

public class Storage
{
    public virtual string Name { get; set; }
    public virtual IList<Box> Boxes { get; set; }
}

public class Box
{
    public virtual string Box { get; set; }
    [DoNotSerialize] public virtual Storage ParentStorage { get; set; }
}

Storage可以包含多个Boxes,而Box始终属于Storage。我想编辑Box's名称,因此我使用JSON将其发送给客户端。请注意,我没有序列化ParentStorage,因为我没有更改它所在的存储空间。

客户端编辑名称并将Box作为JSON发回。服务器将其反序列化为Box实体。

问题是,ParentStorage属性为null。当我尝试将Box保存到数据库时,它会更新名称,但也会删除与Storage的关系。

如何正确地序列化和反序列化像Box这样的实体,同时将JSON数据大小保持在最低限度?

2 个答案:

答案 0 :(得分:2)

我建议您向客户端发送DTO以供显示(并且它应包含唯一的数据库ID)。然后将boxId +新名称从客户端发送回服务器(无需再发送整个DTO)。服务器可以使用ID进行数据库查找以获取box对象,将name字段更新为从客户端发送的名称字段,并将该框保存到数据库。

在这种情况下,没有必要序列化NHibernate对象,这只会增加很多复杂性而且没有价值。

答案 1 :(得分:0)

我猜想ParentStorage是空的,因为它是懒惰加载的。在串行化之前通过调用getter来强制配置它或者强制读取可能有助于确保存储序列化,并且根据您的ID方案,这可能有效(我不确定)。

在这种情况下序列化的收益似乎很小,并且随着Box和Storage类的发展可能会产生意想不到的后果。为名称发送单个字符串,加载Box,设置字符串以及保存该对象似乎更简单。那么你不必担心Hibernate在下面做的优化。