2010-08-06 107 views
0

我有一个类,我想用Fluent NHibernate来定义一个唯一的键。我认为我已经正确地做了这件事,但是我的单位测试中,我保存了两个具有相同字段值的对象,并保存了这两个项目没有错误。下面是我得到了什么:NHibernate的UniqueKey没有被强制执行

映射覆盖:

public class ItemOverride : IAutoMappingOverride<Item> 
{ 
    #region IAutoMappingOverride<Item> Members 

    public void Override(AutoMapping<Item> mapping) 
    { 
     mapping.Map(t => t.Prompt).UniqueKey("UIX_Item_Prompt").Not.Nullable(); 
    } 

    #endregion 
} 

单元测试

[Test] 
public void CannotSaveDuplicateItemPrompt() 
{ 
    ServiceLocatorInitializer.Init(); 
    IItemManagementService itemManagementService = new ItemManagementService(repository); 
    Item first = ItemInstanceFactory.CreateValidTransientItem(); 
    first.Prompt = "Duplicate"; 
    itemManagementService.SaveOrUpdate(first); 
    Item second = ItemInstanceFactory.CreateValidTransientItem(); 
    second.Prompt = "Duplicate"; 

    ActionConfirmation confirm = itemManagementService.SaveOrUpdate(second); 

    Assert.IsFalse(confirm.WasSuccessful); 
    Assert.AreEqual(confirm.Message, ""); 
} 

回答

0

好吧,如果我换了两个交易节省了它的工作原理。这里是新的单元测试:

[Test] 
    [ExpectedException(typeof(GenericADOException))] 
    public void CannotSaveDuplicateItemPrompt() 
    { 
     ServiceLocatorInitializer.Init(); 
     IItemManagementService itemManagementService = new ItemManagementService(repository); 

     NHibernateSession.Current.BeginTransaction(); 

     Item first = ItemInstanceFactory.CreateValidTransientItem(); 
     first.Prompt = "Duplicate"; 
     itemManagementService.SaveOrUpdate(first); 
     Item second = ItemInstanceFactory.CreateValidTransientItem(); 
     second.Prompt = "Duplicate"; 

     ActionConfirmation confirm = itemManagementService.SaveOrUpdate(second); 
     NHibernateSession.Current.Transaction.Commit(); 
    }