Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate从单个对象对同一记录的多个引用_C#_.net_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# NHibernate从单个对象对同一记录的多个引用

C# NHibernate从单个对象对同一记录的多个引用,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,我使用的是Fluent NHibernate,设置如下: 一个地址对象,它是地址字段的简单列表 一个公司对象,它有两个对地址对象的引用,MainAddress和InvoiceAddress 我遇到的问题是,有时MainAddress和InvoiceAddress都可能引用Address表中的同一条记录 地址通过搜索查找,使用以下内容: ICriteria c = session.CreateCriteria(typeof(Address)) .Add(Example.Cr

我使用的是Fluent NHibernate,设置如下:

一个地址对象,它是地址字段的简单列表

一个公司对象,它有两个对地址对象的引用,MainAddress和InvoiceAddress

我遇到的问题是,有时MainAddress和InvoiceAddress都可能引用Address表中的同一条记录

地址通过搜索查找,使用以下内容:

ICriteria c = session.CreateCriteria(typeof(Address))
            .Add(Example.Create(address).ExcludeNone());
因为每个地址是单独选择的,这会导致同一记录的两个实例,这会导致NHibernate在试图保存公司对象时呕吐

“具有相同标识符值的不同对象已与会话关联”

解决这个问题的最佳方法是什么


谢谢

您应该使用NHibernate的
合并

合并():

  • 如果当前存在具有相同标识符的持久实例 与会话关联,复制 将给定对象的状态添加到 持久实例
  • 如果当前没有与会话关联的持久实例, 尝试从数据库中加载,或 创建一个新的持久实例
  • 将返回持久实例
  • 给定实例不会与会话关联,而是 保持分离
它与
SaveOrUpdateCopy
相同,但该命令显然是

我认为SaveOrUpdateCopy是一种 已经从NHibernate退出了 时间和合并是添加在 2.1(显然是从hibernate移植的东西)。无论如何,我很高兴 NHibernate有这个能力是因为 编写和处理合并 手动操作是非常无聊的代码 写作


您应该使用NHibernate的
Merge

合并():

  • 如果当前存在具有相同标识符的持久实例 与会话关联,复制 将给定对象的状态添加到 持久实例
  • 如果当前没有与会话关联的持久实例, 尝试从数据库中加载,或 创建一个新的持久实例
  • 将返回持久实例
  • 给定实例不会与会话关联,而是 保持分离
它与
SaveOrUpdateCopy
相同,但该命令显然是

我认为SaveOrUpdateCopy是一种 已经从NHibernate退出了 时间和合并是添加在 2.1(显然是从hibernate移植的东西)。无论如何,我很高兴 NHibernate有这个能力是因为 编写和处理合并 手动操作是非常无聊的代码 写作

除非您在不同的会话中进行选择,然后将它们混合(这是不正确的),否则NHibernate的默认行为是为同一行检索同一实例,而不管您查询了多少次

确保您使用的是单个会话。

除非您在不同会话中进行选择,然后将它们混合(这是不正确的),否则NHibernate的默认行为是为同一行检索同一实例,而不管您查询了多少次


请确保您使用的是单个会话。

这确实起到了作用,但我认为Diego是正确的,因为它是在单独的会话中执行每个查询造成的。我将研究纠正…这确实起到了作用,但我认为迭戈是正确的,它是由在单独的会话中执行每个查询引起的。将研究纠正这一点。。。