0

我有两个 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; }
}

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

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

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

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

4

2 回答 2

2

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

在这种情况下不需要序列化 ​​NHibernate 对象,这只会增加很多复杂性并且没有任何价值。

于 2010-05-07T10:41:13.973 回答
0

我猜 ParentStorage 是空的,因为它正在被延迟加载。将其配置为急切地获取或通过在序列化之前调用 getter 来强制读取可能有助于确保存储已序列化,并且取决于您的 ID 方案,这可能有效(我不确定)。

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

于 2010-05-07T05:59:23.587 回答