在NHibernate中从子级创建级联时,如何获得新的父级ID?

狂热者

我有一个父子关系,父母没有对孩子的引用-像这样:

class Child
{
    int Id { get; set;
    Parent Parent { get; set; }
    // + other stuff
}

class Parent
{
    int Id { get; set; }
    // + other stuff
}

在数据库中,这仅意味着该Child表具有一ParentID列。该列可以为Parentnull-即可以有一个-less Child

我正在使用Fluent约定来映射域,但是对此关系有一个替代,以便我们可以同时更新Child和创建一个新Parent的:

public class ChildOverride : IAutoMappingOverride<Child>
{
    public void Override(AutoMapping<Child> mapping)
    {
        mapping.References(x => x.Parent).Cascade.All();
    }
}

当我们Parent向现有对象添加新Child并且立即需要(在事务处理中)读取该父对象的ID时,就会出现问题,例如:

existingChild.CreateParent(parameters);
session.Save(existingChild);
Debug.WriteLine(existingChild.Parent.Id);

它只是打印0而不是给我新父母的ID-我以为是Cascade.All()……级联。错了吗

如果我在访问Id之前提交了事务,那么一切都很好,或者如果我也明确保存了同样可行的新Parent,例如

// This works
existingChild.CreateParent(parameters);
session.Save(existingChild);
transaction.Commit();
Debug.WriteLine(existingChild.Parent.Id);

// This also works
existingChild.CreateParent(parameters);
session.Save(existingChild);
session.Save(existingChild.Parent);
Debug.WriteLine(existingChild.Parent.Id);

有什么方法可以更改覆盖,以便保存子对象将允许立即访问父ID?(还是我做错了什么?)

拉迪姆·科勒

这样做的好处是,所有功能均正常运行而且您的映射是正确的因为如果此代码段有效...

// This works
existingChild.CreateParent(parameters);
session.Save(existingChild);
transaction.Commit();

...这个概念也行得通。为什么?到底是什么?为什么Commit()帮助解决这个问题?

好吧,因为ISession是一个抽象,所以它是虚拟的持久性存储。在我们调用时,不会执行任何SQL语句session.Save()它仅保留所有信息(在该会话期间收集)并仅执行SQL WRITE语句

  • (如果急需的话)(进一步的工作需要DB生成的ID)
  • 如果会话决定(如果允许,请参见下面的会话模式自动)
  • 如果明确要求

但是更好更精确的是引用doc:

9.6。冲洗

ISession会不时执行将ADO.NET连接状态与保存在内存中的对象状态同步所需的SQL语句。默认情况下,此过程在以下几点进行刷新

...

除非您明确声明Flush()否则绝对不能保证Session执行ADO.NET调用的时间,仅保证它们执行的顺序。但是,NHibernate确实保证了ISession.Find(..)方法将永远不会返回过时的数据。他们也不会返回错误的数据。

可以更改默认行为,以便减少刷新的频率。所述FlushMode类定义了三种不同的模式:仅在提交时齐平(并且使用NHibernate的ITransaction API仅当),自动地使用该解释常规冲洗(只会明确的NHibernate ITransaction内部工作),或者从未除非冲洗冲洗()是显式调用。最后一种模式对于长时间运行的工作单元很有用,在这种情况下,ISession长时间保持打开和断开状态(请参见第11.4节“乐观的并发控制”)。

并且有答案。FlushMode设置:

public enum FlushMode
{
    Unspecified = -1,
    Never = 0,
    Commit = 5,
    Auto = 10,
    Always = 20,
}

因此,如果FlushMode为Commit-仅事务提交触发session.Flush()

但是我们可以随时自己做:

// This works
existingChild.CreateParent(parameters);
session.Save(existingChild);
session.Flush();

现在父级将具有ID-因为会话状态刚刚转换为SQL WRITE操作...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Javascript中从子级调用父级函数

来自分类Dev

SWT为什么在父级中创建新的Composite时要调整父级Composite的大小?

来自分类Dev

如何获得组件的父级的父级?

来自分类Dev

如何获得组件的父级的父级?

来自分类Dev

如何从子窗口访问父级中的div

来自分类Dev

休眠一对多级联全部不将子级ID保存在父级中

来自分类Dev

如何创建从子级到父级的委派(subview-superview)

来自分类Dev

如何使用钩子从数据库登录时将数据从子级更新为父级

来自分类Dev

单击列表项时如何将数据从子级传递到父级

来自分类Dev

在反应中如何将数据从子级传递到父级?

来自分类Dev

在React中,如何正确地将输入值从子级传递给父级

来自分类Dev

如何在 React Hooks 中触发从子级到父级的状态变化?

来自分类Dev

如何在Vuejs中从子级到父级$emit以重置数据列表

来自分类Dev

如何以树状结构从子级移到父级?

来自分类Dev

在 ReactJs 中从子级更改父级的状态

来自分类Dev

Javascript中从子级到父级的回调函数

来自分类Dev

从子级在父级中设置状态 - React?

来自分类Dev

当方法不属于父级原型时,是否可以从子级调用父级方法?

来自分类Dev

创建两个新父级时在联接模型中设置属性

来自分类Dev

当数据库中已经存在子级时,NHibernate级联插入

来自分类Dev

我如何在初始加载时获得父级中的 Child 状态?

来自分类Dev

如何从子级调用父级函数并且不更新父级状态?

来自分类Dev

如何在单击时选择具有ID /类的父级元素而不是父级元素?

来自分类Dev

NHibernate使用删除级联从父集合中删除子级

来自分类Dev

保存父级时,Hibernate 不会将父级的 ID 保存在子表中

来自分类Dev

从子级设置父级属性

来自分类Dev

VueJS从子级修改父级变量

来自分类Dev

从子级设置父级属性

来自分类Dev

MySQL从子级调用父级

Related 相关文章

  1. 1

    如何在Javascript中从子级调用父级函数

  2. 2

    SWT为什么在父级中创建新的Composite时要调整父级Composite的大小?

  3. 3

    如何获得组件的父级的父级?

  4. 4

    如何获得组件的父级的父级?

  5. 5

    如何从子窗口访问父级中的div

  6. 6

    休眠一对多级联全部不将子级ID保存在父级中

  7. 7

    如何创建从子级到父级的委派(subview-superview)

  8. 8

    如何使用钩子从数据库登录时将数据从子级更新为父级

  9. 9

    单击列表项时如何将数据从子级传递到父级

  10. 10

    在反应中如何将数据从子级传递到父级?

  11. 11

    在React中,如何正确地将输入值从子级传递给父级

  12. 12

    如何在 React Hooks 中触发从子级到父级的状态变化?

  13. 13

    如何在Vuejs中从子级到父级$emit以重置数据列表

  14. 14

    如何以树状结构从子级移到父级?

  15. 15

    在 ReactJs 中从子级更改父级的状态

  16. 16

    Javascript中从子级到父级的回调函数

  17. 17

    从子级在父级中设置状态 - React?

  18. 18

    当方法不属于父级原型时,是否可以从子级调用父级方法?

  19. 19

    创建两个新父级时在联接模型中设置属性

  20. 20

    当数据库中已经存在子级时,NHibernate级联插入

  21. 21

    我如何在初始加载时获得父级中的 Child 状态?

  22. 22

    如何从子级调用父级函数并且不更新父级状态?

  23. 23

    如何在单击时选择具有ID /类的父级元素而不是父级元素?

  24. 24

    NHibernate使用删除级联从父集合中删除子级

  25. 25

    保存父级时,Hibernate 不会将父级的 ID 保存在子表中

  26. 26

    从子级设置父级属性

  27. 27

    VueJS从子级修改父级变量

  28. 28

    从子级设置父级属性

  29. 29

    MySQL从子级调用父级

热门标签

归档