C# 检查重复值

C# 检查重复值,c#,nhibernate,C#,Nhibernate,假设我有下表: PERSON : ID INT NAME STRING LASTNAME STRING 在我的CRUD应用程序中,我不能允许用户插入现有的NAME-LASTNAME组合。最好的方法是什么?用户可以插入新用户,也可以编辑已存在的用户。您没有指定数据库,但如果您使用的是SQL Server 2008或更高版本,则应在列上创建一个复合唯一索引,因为只有活动用户才应是唯一的、经过筛选的 CREATE UNIQUE INDEX uix ON PERSON(NAME, LASTNAME)

假设我有下表:

PERSON :
ID INT
NAME STRING
LASTNAME STRING

在我的CRUD应用程序中,我不能允许用户插入现有的
NAME-LASTNAME
组合。最好的方法是什么?用户可以插入新用户,也可以编辑已存在的用户。

您没有指定数据库,但如果您使用的是SQL Server 2008或更高版本,则应在列上创建一个复合唯一索引,因为只有活动用户才应是唯一的、经过筛选的

CREATE UNIQUE INDEX uix ON PERSON(NAME, LASTNAME) WHERE ACTIVE=1;

此索引将只为活动用户编制索引,并且只允许在他们身上复制。

您有权访问数据库吗?您能在这两列上设置唯一约束吗?是的,我有访问权限。但我不能使用唯一约束,因为我的表有一个属性(bool isActive),并且只有当该人员处于活动状态时才必须进行验证。您的意思是,如果该人员未被标记为活动状态,则可以有重复项?这听起来不是很连贯,你最好在所有情况下都坚持单一行为,以避免数据库中出现混乱。无论如何,您可以在插入之前通过NHibernate请求执行检查,那又如何?我可以看到两种可能性:1)使用插入触发器并在那里进行验证。2) 在代码中进行验证。@AlexMendez很遗憾,我不确定Oracle是否支持任何隔离模式,允许您在没有完整表锁的情况下手动执行安全的唯一检查/插入。很高兴被证明是错误的:)我使用的是nhibernate和Oracle,Oracle中缺少过滤索引,我能看到的唯一可执行的数据库选项是将isActive映射到NULLabe日期(可能称为DISACTIVEDAT),null表示活动用户,时间是停用时的时间戳。您应该能够在NHibernate中将该映射映射到一个isActive bool,它将让您在name/lastname/deactivatedAt上拥有一个唯一的索引。这并不能解决OP的问题,但很高兴知道这一点。我没有意识到这种可能性。美好的