NHibernate-尝试使其使用SQL Server行版本

NHibernate-尝试使其使用SQL Server行版本,nhibernate,Nhibernate,根据StackOverflow问题“NHibernate和sql时间戳列作为版本”,我使用以下映射: <version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob"> <column name="RowNumber" not-null="false" sql-type="timestamp" /> </version> <pro

根据StackOverflow问题“NHibernate和sql时间戳列作为版本”,我使用以下映射:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

(最后一个之后的其他属性)

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
但当我运行ASP.MVC应用程序时,我得到:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
[Path]\Clients.hbm.xml(7,90):xml验证错误:元素“urn:nhibernate-mapping-2.2:version”不能包含子元素“urn:nhibernate-mapping-2.2:column”,因为父元素的内容模型为空

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
但据我所知,2.2是映射的最新版本,那么如何在version元素中放置column元素呢

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
很抱歉,如果这是非常基本的,请在中快速查看会发现您的映射不正确。应该是这样的:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
<version name="RowNumber" column="RowNumber"
         generated="always" unsaved-value="null"
         type="Timestamp" />

致以最诚挚的问候,
奥利弗·哈纳皮(Oliver Hanappi)

快速查看中的内容会发现您的映射不正确。应该是这样的:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
<version name="RowNumber" column="RowNumber"
         generated="always" unsaved-value="null"
         type="Timestamp" />

致以最诚挚的问候,

Oliver Hanappi

如果其他人有此问题:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
它的工作原理与Ayende Rahien在NHibernate上的博客中指定的一样,但仅在版本2.1.n上使用(AFAIK);我用的是2.0.n。我还认为需要将对象的字段/属性设置为byte[],而不是System.Linq.Binary,因为该类型没有默认构造函数(但我对此不确定-我似乎必须这样做)

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
示例(请原谅姓名):

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

SQL server“时间戳”不是常规的时间戳,因此要求类型应为二进制blob

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

请注意,如果确实进行迁移,则需要更改Web/App config中的NHibernate配置-当前提供的大多数教程似乎适用于v.2.0(或更早版本)-如果其他人有此问题,则需要2.1的最新参考或教程:

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
它的工作原理与Ayende Rahien在NHibernate上的博客中指定的一样,但仅在版本2.1.n上使用(AFAIK);我用的是2.0.n。我还认为需要将对象的字段/属性设置为byte[],而不是System.Linq.Binary,因为该类型没有默认构造函数(但我对此不确定-我似乎必须这样做)

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />
示例(请原谅姓名):

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

SQL server“时间戳”不是常规的时间戳,因此要求类型应为二进制blob

<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />

请注意,如果确实迁移,则需要更改Web/App config中的NHibernate配置-当前提供的大多数教程似乎适用于v.2.0(或更早版本)-您需要2.1的最新参考或教程

感谢您的回复-但这会产生:无法在Byte[]类型的字段RowNumber0_u中强制转换值到类型TimestampType。请检查以确保映射正确,并且您的数据提供程序支持此数据类型。根据Ayende的博客,我明白了,SQL server rowversion/时间戳需要映射到BinaryBlobAh。您是否尝试过BinaryBlob数据类型或Int32或类似的东西?我使用Timestamp是因为NHibernate文档说您只能使用很少的类型:Int64、Int32、Int16、Ticks、Timestamp或TimeSpan。感谢您的回复-但这会产生:无法将Byte[]类型的字段RowNumber0_uu中的值强制转换为TimestampType。请检查以确保映射正确,并且您的数据提供程序支持此数据类型。根据Ayende的博客,我明白了,SQL server rowversion/时间戳需要映射到BinaryBlobAh。您是否尝试过BinaryBlob数据类型或Int32或类似的东西?我使用时间戳是因为NHibernate文档说您只能使用很少的类型:Int64、Int32、Int16、Ticks、Timestamp或TimeSpan。
<version name="RowNumber" generated="always" unsaved-value="null" type="BinaryBlob">       
    <column name="RowNumber" not-null="false" sql-type="timestamp" />
</version>

<property name="CreateDate" column="CreateDate" type="DateTime" update="false" insert="false" />