2012-05-24 60 views
0

我使用NHibernate將我的對象映射到數據庫。其中一個對象稱爲「附件」。其ID是使用MS SQL Server 2008中的「newsequentialid」(作爲默認值或綁定)爲ID列創建Guid而生成的。在數據庫中使用「newsequentialid」時Nhibernate身份映射

現在我想要的是,當插入一個新的附件時,NHibernate將允許SQL Server使用newsequentialid創建Guid。事情是,我不斷收到一個例外,「空標識符」試圖挽救一個新的附件,其中ID沒有設定(Guid.Empty)

這裏的時候是我的HBM文件:

<class name="DataObjects.Services.NHAttachment, DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" mutable="false" table="Attachments"> 
    <id name="Id" column="Guid" type="Guid" > 
     <generator class="native" /> 
    </id>..... 

正如你可以看到ID是使用生成器類作爲本機設置的。

感謝您提前提供的所有幫助! :)

回答

0

如果你想告訴NHibernate的數據庫架構創建一個GUID,那麼我認爲下面應該工作:

<id name="Id" column="Guid" type="Guid"> 
    <generator class="guid" /> 
</id> 
0

截至2013年6月12日,NHibernate的3.3似乎不支持NEWSEQUENTIALID正確,因爲我嘗試過,並且失敗。

例如,具有

sec_UserRole 
    (UserRoleId UNIQUEIDENTIFIER DEFAULT NewSequentialId(), 
    UserId, 
    RoleId, 
    CreationDate, 
    CreatedBy) 

隨着測繪

public SecUserRoleMapping() 
    { 
     Table("sec_UserRole"); 
     Id(x => x.UserRoleId, m => m.Generator(Generators.Native); 

我碰到下面的SQL:

declare @p0 uniqueidentifier 
declare @p1 uniqueidentifier 
declare @p2 datetime2 
declare @p3 uniqueidentifier 
    set @p0 = '00000000-0000-0000-0000-000000000001' 
    set @p1 = '383b75fd-6829-41b5-b8a6-63f1dc1acef0' 
    set @p2 = '12/6/2013 5:09:56 AM' 
    set @p3 = '00000000-0000-0000-0000-000000000001' 

INSERT 
    INTO 
     sec_UserRole 
     (UserId, RoleId, CreationDate, CreatedBy) 
    VALUES 
     (@p0, @p1, @p2, @p3); 
    **select 
     SCOPE_IDENTITY();** 

注意**突出部分。它試圖獲得最後的身份!當它應該使用OUTPUT子句並使用輸出參數獲取它時。 http://jwwishart.wordpress.com/2009/08/05/returning-the-newsequentialid-after-insert-using-the-output-clause/

所以我的下一步是嘗試創建一個新的自定義生成器。 http://nhibernate.info/doc/howto/various/creating-a-custom-id-generator-for-nhibernate.html

+0

我試着創建一個自定義的生成器,這並不難,但要獲得NEWSEQUENTIALID的最後一個值,你必須創建一個臨時表,所以我認爲這是一個矯枉過正。我決定只使用GuidComb,我讀它是一個GUID,但是有一個序列。 –