我有两个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数据大小保持在最低限度?
答案 0 :(得分:2)
我建议您向客户端发送DTO以供显示(并且它应包含唯一的数据库ID)。然后将boxId +新名称从客户端发送回服务器(无需再发送整个DTO)。服务器可以使用ID进行数据库查找以获取box对象,将name字段更新为从客户端发送的名称字段,并将该框保存到数据库。
在这种情况下,没有必要序列化NHibernate对象,这只会增加很多复杂性而且没有价值。
答案 1 :(得分:0)
我猜想ParentStorage是空的,因为它是懒惰加载的。在串行化之前通过调用getter来强制配置它或者强制读取可能有助于确保存储序列化,并且根据您的ID方案,这可能有效(我不确定)。
在这种情况下序列化的收益似乎很小,并且随着Box和Storage类的发展可能会产生意想不到的后果。为名称发送单个字符串,加载Box,设置字符串以及保存该对象似乎更简单。那么你不必担心Hibernate在下面做的优化。