Sql server NHibernate-必须更改保存顺序才能满足数据库约束?

Sql server NHibernate-必须更改保存顺序才能满足数据库约束?,sql-server,nhibernate,Sql Server,Nhibernate,我们的数据团队中有人添加了一个数据库约束,虽然它是完全有效和可取的,但它给NHibernate带来了很大的问题,因为似乎没有办法覆盖NHibernate的保存顺序 给出这样一个(愚蠢的例子)类: public Person { public virtual string FirstName { get; set; } public virtual bool IsCurrent { get; set; } } 还有一个约束,即支持表中只能有一条记录同时为IsCurre

我们的数据团队中有人添加了一个数据库约束,虽然它是完全有效和可取的,但它给NHibernate带来了很大的问题,因为似乎没有办法覆盖NHibernate的保存顺序

给出这样一个(愚蠢的例子)类:

public Person
{  
    public virtual string FirstName { get; set; }  
    public virtual bool IsCurrent { get; set; }  
}
还有一个约束,即支持表中只能有一条记录同时为
IsCurrent=true

如果我试图通过设置
IsCurrent=false
来“弃用”现有记录,并用
IsCurrent=true
的新记录替换它,则在保存时会出现ADO异常,因为NHibernate尝试首先执行插入,这违反了SQL Server的约束,即一次只能有一条记录
IsCurrent=true

我看到两种选择:

  • SQL Server是否可以配置为仅在事务结束时检查约束?下面的语句(将旧行“更新”为
    IsCurrent=false)将取消该约束
  • NHibernate的保存顺序(对于相同类型的实例)是否可以 以任何方式修改或“暗示”
  • 谢谢!
    杰夫

    任何一种方法都是可能的;我会倾向于#2。如果你打电话:

    session.saveOrUpdate(person1);
    session.flush();
    session.saveOrUpdate(person2);
    

    刷新会将SQL语句推送到数据库。我相信这会解决您的问题。(上面是java Hibernate代码,您的语法可能略有不同)。

    这里的问题是NHibernate不知道数据库层中的所有数据完整性检查。 如果您在操作数据时入侵SQL server并在一段(短)时间内禁用约束,则可以选择1。但这是一个肮脏的解决方案,因为此时正在处理的所有事务都禁用了约束

    在这种特殊情况下,我将使用一种中心方法:
    没有完整性检查。数据完整性基于插入或更新时触发触发器。触发器负责将所有相关记录(当前插入或更新的记录除外)的IsCurrent设置为false。当然,您必须处理递归触发器触发,因为使用触发器时,您正在修改中的记录触发触发器的同一个表。

    您可以发布用于保存数据的代码吗?而且,听起来您的实体ID使用SQL Server标识,这有一个问题,即NHibernate必须实际插入第二条记录,以便在事务完成之前获取其ID。选项1不可能:MSSQL没有def错误的约束。但根据描述,我强烈怀疑逻辑实际上是通过触发器而不是约束来实现的。不过,这并不能真正改变基本问题,最好的解决方案当然是按正确的顺序修改数据。+1:直接调用flush可能是处理此问题的最佳方法