C# 当ID<;时,NHibernate写入值=NULL;0

C# 当ID<;时,NHibernate写入值=NULL;0,c#,nhibernate,fluent-nhibernate,null,C#,Nhibernate,Fluent Nhibernate,Null,我们想实现一个简单的规则,在该规则中,当实体的ID等于-1时,NHibernate将为数据库分配(持久化)NULL。例如,我们有一个“系统内”帐户,它应该作为NULL持久化到数据库中 如果尝试将ID-1持久化到数据库中,则会出现外键异常,因为该ID在外部表中不存在 我们将NHibernate与FluentNhibernate一起使用。我认为您没有正确映射实体。如果它是正确的,您应该采取任何技巧:您不应该看到一个ID,而是对另一个实体的引用,在这种情况下,您将使用空值持久化引用。即使在错误的情况下

我们想实现一个简单的规则,在该规则中,当实体的ID等于-1时,NHibernate将为数据库分配(持久化)NULL。例如,我们有一个“系统内”帐户,它应该作为NULL持久化到数据库中

如果尝试将ID-1持久化到数据库中,则会出现外键异常,因为该ID在外部表中不存在


我们将NHibernate与FluentNhibernate一起使用。

我认为您没有正确映射实体。如果它是正确的,您应该采取任何技巧:您不应该看到一个ID,而是对另一个实体的引用,在这种情况下,您将使用空值持久化引用。即使在错误的情况下,您希望使用表示为ID的引用来映射实体(这几乎总是错误的)。如果此ID可为null,请将其映射为可为null的,这样您就有int?你可以用null来表示null,而不是-1技巧

见评论

如果自定义实体在内部用作null值,那么会话侦听器可能会有所帮助:处理OnSave并通过将伪实体替换为null来处理特殊情况。 关于NH拦截器。
在同一份文件的第11.2章中,有一部分与事件有关,与这类问题相当。

我认为您没有正确映射您的实体。如果它是正确的,您应该采取任何技巧:您不应该看到一个ID,而是对另一个实体的引用,在这种情况下,您将使用空值持久化引用。即使在错误的情况下,您希望使用表示为ID的引用来映射实体(这几乎总是错误的)。如果此ID可为null,请将其映射为可为null的,这样您就有int?你可以用null来表示null,而不是-1技巧

见评论

如果自定义实体在内部用作null值,那么会话侦听器可能会有所帮助:处理OnSave并通过将伪实体替换为null来处理特殊情况。 关于NH拦截器。
在同一份文件的第11.2章中,有一部分与事件有关,相当于此类问题。

谢谢你,费利斯。我应该澄清一下。我们正在持久化对对象的引用,而不是ID本身。我们在应用程序中创建一个ID=-1 internal的对象。如果将此实体分配给属性,则保存到数据库的属性值应为NULLthank you Felice。我读到拦截程序已经被NHibernate最新版本中的事件所取代。我需要为OnLoad和OnSave创建哪些事件侦听器?谢谢你,费利斯。我应该澄清一下。我们正在持久化对对象的引用,而不是ID本身。我们在应用程序中创建一个ID=-1 internal的对象。如果将此实体分配给属性,则保存到数据库的属性值应为NULLthank you Felice。我读到拦截程序已经被NHibernate最新版本中的事件所取代。我需要为OnLoad和OnSave创建哪些事件侦听器?