从 Backbone 到 NHibernate 的数据工作流
Workflow for data from Backbone through NHibernate
这道题不是code-centric,而是成语题。我在前面使用 Backbone/Marionette,在后面使用 C#、NHibernate。
我已经映射了一些 table 并正在创建和更新。为简单起见,假设我有两个 table,一个 parent 和 child,而 child 可能有很多行。 child 对 parent 的引用是 not-nullable,所以我得到了反向关系,这一切都有效。从 Backbone 到控制器再到 NHibernate 的数据流非常简单,最后我使用了 ISession.SaveOrUpdate() 。如有必要,我可以 post 映射等等。我会说 Fluent NHibernate 生成的映射在 parent.
上使用 Bag
这是我试图了解的情况的具体示例。假设我在 child table 中有一个包含两行的 parent 条目。我对数据进行了操作,以便删除 children 之一,但没有进行其他更改。 Javascript 通过 object "tree" 发送 parent 条目和剩下的 child 行。映射都处理得很好,但是生成的 sql 是一堆(不必要的,但无论如何)更新语句。相反,我想要发生的是 NHibernate 注意到在这个新的 object 中只有一个 child 关系,但在实际数据库中有两个 children,然后 NHibernate 删除另一个 child。 'cascade-delete-orphans' 选项不起作用,因为另一个 child 实际上并没有被孤立。它仍然引用 fk 列中的 parent,并且该列无论如何都是 non-nullable,这就是我使用反向映射选项的原因。
是否可以在映射中设置?如果没有,解决这种情况的好方法是什么?
由于您从客户端发送一个对象,然后从该对象创建实体并尝试持久化,NHibernate 不会自动删除子实体,因为它不知道子对象被删除(它只看到你只是尝试更新一个父实体和一个子实体),我认为这是正确的。例如,如果您只想更新父实体字段,则必须加载整个对象图才能执行此操作,否则 NHibernate 将删除所有未加载的子项。
你在这里应该做的是加载父实体,并删除从中删除的丢失的子实体然后持久化(而不是映射实体),代码应该如下所示,
void Update(ParentDto parentDto){
Parent parent = _session.Get<Parent>(parentDto.Id);
//update parent fields
var childRemoved = //find removed child from parent;
parent.Children.Remove(childRemoved);
_session.SaveOrUpdate(parent);
}
这道题不是code-centric,而是成语题。我在前面使用 Backbone/Marionette,在后面使用 C#、NHibernate。
我已经映射了一些 table 并正在创建和更新。为简单起见,假设我有两个 table,一个 parent 和 child,而 child 可能有很多行。 child 对 parent 的引用是 not-nullable,所以我得到了反向关系,这一切都有效。从 Backbone 到控制器再到 NHibernate 的数据流非常简单,最后我使用了 ISession.SaveOrUpdate() 。如有必要,我可以 post 映射等等。我会说 Fluent NHibernate 生成的映射在 parent.
上使用 Bag这是我试图了解的情况的具体示例。假设我在 child table 中有一个包含两行的 parent 条目。我对数据进行了操作,以便删除 children 之一,但没有进行其他更改。 Javascript 通过 object "tree" 发送 parent 条目和剩下的 child 行。映射都处理得很好,但是生成的 sql 是一堆(不必要的,但无论如何)更新语句。相反,我想要发生的是 NHibernate 注意到在这个新的 object 中只有一个 child 关系,但在实际数据库中有两个 children,然后 NHibernate 删除另一个 child。 'cascade-delete-orphans' 选项不起作用,因为另一个 child 实际上并没有被孤立。它仍然引用 fk 列中的 parent,并且该列无论如何都是 non-nullable,这就是我使用反向映射选项的原因。
是否可以在映射中设置?如果没有,解决这种情况的好方法是什么?
由于您从客户端发送一个对象,然后从该对象创建实体并尝试持久化,NHibernate 不会自动删除子实体,因为它不知道子对象被删除(它只看到你只是尝试更新一个父实体和一个子实体),我认为这是正确的。例如,如果您只想更新父实体字段,则必须加载整个对象图才能执行此操作,否则 NHibernate 将删除所有未加载的子项。
你在这里应该做的是加载父实体,并删除从中删除的丢失的子实体然后持久化(而不是映射实体),代码应该如下所示,
void Update(ParentDto parentDto){
Parent parent = _session.Get<Parent>(parentDto.Id);
//update parent fields
var childRemoved = //find removed child from parent;
parent.Children.Remove(childRemoved);
_session.SaveOrUpdate(parent);
}