【发布时间】:2011-01-29 04:18:44
【问题描述】:
说明:
假设我有一个嵌套了好几层的对象图,每个实体之间都有双向关系。
A -> B -> C -> D -> E
或者换句话说,A 有一个B 的集合,B 有一个对A 的引用,而B 有一个C 的集合,C 有一个返回的引用到B等...
现在假设我想为C 的实例编辑一些数据。在 Winforms 中,我会使用这样的东西:
var instanceOfC;
using (var session = SessionFactory.OpenSession())
{
// get the instance of C with Id = 3
instanceOfC = session.Linq<C>().Where(x => x.Id == 3);
}
SendToUIAndLetUserUpdateData(instanceOfC);
using (var session = SessionFactory.OpenSession())
{
// re-attach the detached entity and update it
session.Update(instanceOfC);
}
简单来说,我们从数据库中抓取一个持久实例,将其分离,将其提供给 UI 层进行编辑,然后重新附加并将其保存回数据库。
问题:
这适用于 Winform 应用程序,因为我们始终使用相同的实体,唯一的区别是它从持久化到分离再到持久化。
问题是,现在我正在使用 Web 服务和浏览器,通过 JSON 数据发送。实体被序列化为字符串,并反序列化为 new 实体。它不再是一个分离的实体,而是一个临时实体,恰好与持久实体(和更新的字段)具有相同的 ID。如果我使用此实体进行更新,它将消除与B 和D 的关系,因为它们不存在于这个新的临时实体中。
问题:
我的问题是,我如何通过网络将分离的实体序列化到客户端,接收它们并保存它们,同时保留我没有明确更改的任何关系?我知道ISession.SaveOrUpdateCopy 和ISession.Merge()(他们似乎做同样的事情?),但如果我没有明确设置它们,这仍然会消除关系。我可以将临时实体中的字段一个一个地复制到持久实体中,但这在关系方面效果不佳,我必须手动处理版本比较。
【问题讨论】:
-
我还想补充一点,我无法在网上找到任何涵盖此问题的资源。我在分离实体上找到的所有 NHibernate 指南都将其作为您保留在一个应用程序范围内的参考,或者将其作为与任何其他实体没有关系的单个实体来处理。
-
嗨,你有没有得到这个问题的答案?
-
嗨 CraftyFella,我刚刚发布了一个答案,详细说明了我在案例中所做的事情。
-
merge 和 saveorupdatecopy 做同样的事情,但是 saveorupdatecopy 不再使用,merge 是 api 标准向前发展。
-
根据我的经验,
Merge()在取消关系方面存在同样的问题。
标签: web-services nhibernate serialization session-state entity-relationship