FluentNHibernate SaveOrUpdate错误

时间:2016-04-21 12:15:04

标签: c# nhibernate fluent-nhibernate asp.net-web-api2

我正在使用FluentNHibernate,使用WebApi 2.0。我将简要介绍一下我正在努力实现的目标。

所以基本上我的Azure数据库中有2个表,为简单起见,表1为Emails,第二个表为Events

因此,在我的EmailsController中,调用者基本上会传递一些基本上由电子邮件构成的JSON数据(即主题,发件人等)。

出现复杂化是因为在我的Emails表中,我在代码中生成主键。这是一个32个字符的GUID。

Events表中的主键是带有IDENTITY的数据库生成字段。

出于性能原因,我的网络应用程序需要能够将第一个相应的事件存储到我的电子邮件对象中。

所以基本上,我在我的电子邮件对象上调用Save。然后再向下调用我的事件对象上的Save。由于Events表的PK是通过Azure自动生成的。我能够检索到这一点,但是当我想编辑我的电子邮件对象并将其保留回数据库时,会出现复杂情况。

我继续收到以下错误一个不同的对象,其标识符值已经与会话相关联

我知道错误意味着什么并且它很容易理解,但我该如何解决这个问题呢?

我需要将自动生成的PK从Events对象存储回我的Email对象中的另一个字段。听起来很简单,但不能为我的生活让这件事情起作用。

我尝试过调用Merge(这是SaveOrUpdateCopy的替代品),但仍无效。似乎并没有真正持续下去。

我可以发布映射代码以及调用简单Save方法的方法。

对此有任何简单的解决方法吗?

1 个答案:

答案 0 :(得分:1)

Save仅用于插入新实体。请勿使用Save更新现有实体。

如果实体是从当前的NHibernate会话加载的,那么您只需要提交您的事务。没有必要告诉NHibernate你修改了它。 (或者如果你不使用交易,则刷新会话,这对于NH来说是一件坏事,原因很多,但这对你的麻烦来说是偏离主题的。)

如果您的实体与当前会话分离,则必须使用ISession.Update将其附加到会话中进行更新。 (此时它不会在DB中更新。您仍然必须提交当前事务(或者如果不使用事务,则刷新会话)。)

此时(调用Update),如果您有错误具有相同标识符值的其他对象已与会话相关联,则表示您已加载此实体在会议中。这对我来说就像会话的异常使用:
您要么直接从JSON反序列化中保存您的实体,然后您不应该已经将它加载到您用于该会话的会话中。或者您首先加载实体以从会话更新,然后复制值以更新它,最后只提交事务。

一个快速而丑陋的修复,因为我没有尝试调试您在会话中已经拥有它的原因,可能是在Update之前调用它:

session.Evict(session.Load<YourEntityType>(itsKey));

但这只是一个解决方法,不会调查代码实际出现的问题。