Nhibernate .hbm.xml文件中唯一,未引发异常

Nhibernate .hbm.xml文件中唯一,未引发异常,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我的.hbm.xml文件中包含以下内容 <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Core.Domain.Model" assembly="Core"> &l

我的.hbm.xml文件中包含以下内容

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                                    namespace="Core.Domain.Model"
                                    assembly="Core">

  <class name="Category" table="Categories" dynamic-update="true">
    <cache usage="read-write"/>
    <id name="Id" column="Id" type="Guid">
      <generator class="guid"/>
    </id>
    <property name="Name" length="100">
    <column name="Name" unique="true" index="IX_Category"/>
    </property>
  </class>
</hibernate-mapping>


我有下面的代码,但是,当我为Name字段插入一个重复的值时,我可以看到没有引发异常。为什么会这样

 void IRepository<Category>.Save(Category entity)
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Required))
            {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.Save(entity);
                    transaction.Commit();
                }
            }
            scope.Complete();
            }    
        }
void IRepository.Save(类别实体)
{
使用(var范围=新TransactionScope(TransactionScopeOption.Required))
{
使用(ISession session=NHibernateHelper.OpenSession())
{
使用(ITransaction transaction=session.BeginTransaction())
{
session.Save(实体);
Commit();
}
}
scope.Complete();
}    
}

NHibernate是否为您生成了数据库架构?因为即使将属性设置为
unique
,如果架构没有
unique
约束,它也不会执行任何操作。基本上,该属性不会查询数据库以寻找唯一性;它将只设置为on
insert

NHibernate是否为您生成了数据库架构?因为即使将属性设置为
unique
,如果架构没有
unique
约束,它也不会执行任何操作。基本上,该属性不会查询数据库以寻找唯一性;它将仅设置on
insert

唯一属性仅在(hbm)时使用

如果您想使用NHibernate检查唯一性,这是数据验证,您应该查看。 正如Rafael所说,您必须编写自己的验证器

您还可以检查元素

除非您绝对需要在应用程序端验证唯一性,否则这会让我觉得让数据库来完成这项工作可能更好

唯一属性仅在(hbm)时使用

如果您想使用NHibernate检查唯一性,这是数据验证,您应该查看。 正如Rafael所说,您必须编写自己的验证器

您还可以检查元素


除非您绝对需要在应用程序端验证唯一性,否则这会让我觉得让数据库来完成这项工作可能更好

注意,即使使用优秀的NHibernate验证器,您也必须编写自己的验证,因为它显然没有[唯一]验证器(这需要对数据库进行点击)。没错,编辑内容包括,如果必须对持久化数据进行验证,那么这可能只是一个好的做法。注意,即使使用优秀的NHibernate验证程序,您也必须编写自己的验证,因为它显然没有[唯一]验证程序(这需要对数据库进行点击)。没错,编辑内容包括,如果必须对持久化数据进行绝对验证,则这可能是一种良好的做法。谢谢,我已修改了数据库,但现在我收到了违反唯一密钥约束“UQ_uuucategories_uu0ea330e9”的错误消息。无法在对象“dbo.Categories”中插入重复键。该语句已终止,但是,我希望由NHibernate生成错误消息,(e.InnerException.message,即类似message=“无法在具有唯一索引“IX\U Category”的对象“dbo.Categories”中插入重复的键行”。\r\n该语句已终止。”…我希望nHibernate生成抛出异常消息,如JoeBilly所说,查看nHibernate验证器。然后,您可以进行nHibernate唯一性检查并抛出您想要的任何内容。谢谢,我已修改了数据库,但现在我遇到了违反唯一密钥约束“UQ_uucategories_uu0ea330e9”的错误消息。无法插入ert对象“dbo.Categories”中存在重复键。该语句已终止,但是,我希望由NHibernate生成错误消息,(e.InnerException.message,即类似message=“无法在具有唯一索引“IX_Category”的对象“dbo.Categories”中插入重复键行。\r\n该语句已终止。”…我更希望nHibernate生成抛出异常消息,如JoeBilly所说,查看nHibernate验证器。然后,您可以检查nHibernate的唯一性并抛出您想要的任何消息。