2010-09-16 29 views
0

我有我的.hbm.xml文件中的.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> 

我有下面的代碼下面,不過,我可以看到,也不例外當我爲名稱字段插入重複值時正在引發。爲什麼?

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(); 
      }  
     } 

回答

2

NHibernate是否爲您生成數據庫架構?因爲即使您將屬性設置爲unique,但如果架構沒有unique約束,它也不會執行任何操作。基本上,該屬性不會查詢數據庫尋找唯一性;它只會將SQL constraint設置爲insert

+0

謝謝,我修改了數據庫,但現在我有錯誤消息違反UNIQUE KEY約束'UQ__Categories__0EA330E9'。無法在對象'dbo.Categories'中插入重複鍵。該語句已被終止,但是,我寧願有NHibernate產生的錯誤信息,(e.InnerException.Message,即類似Message =「不能在對象'dbo.Categories'中插入具有唯一索引'IX_Category'的重複鍵行\ r \ n此語句已終止。「......我寧願NHibernate的生成拋出異常消息 – learning 2010-09-17 07:03:45

+0

像JoeBilly說,考慮NHibernate的驗證。然後,您可以讓NHibernate的檢查唯一扔任何你想要的。 – rebelliard 2010-09-17 12:06:37

3

唯一屬性僅用於generating a DDL schema from a mapping(hbm)。

如果你想檢查NHibernate的唯一性,它是數據驗證,你應該看看NHibernate validator。 而拉斐爾說,你必須編寫你自己的驗證器。

您還可以檢查natural-id元素。

除非您絕對需要在應用程序端驗證唯一性,否則samplethis one會讓我覺得讓數據庫完成這項工作可能會更好。

+1

注意,即使使用優秀的NHibernate驗證器,您也必須編寫自己的驗證,因爲它顯然沒有[Unique]驗證器(這將需要命中數據庫)。 – rebelliard 2010-09-16 17:12:28

+0

確實,編輯爲包含它可能是如果對持久數據完全進行驗證,那麼這只是一個很好的做法。 – JoeBilly 2010-09-17 12:29:31