【问题标题】:NHibernate and versioning (timestamp)NHibernate 和版本控制(时间戳)
【发布时间】:2023-03-28 14:39:01
【问题描述】:

我遇到了这个异常

在 System.Convert.ToDateTime(对象值)
在 NHibernate.Type.DateTimeType.Get(IDataReader rs, Int32 index) 在 p:\nhibernate-core\src\NHibernate\Type\DateTimeType.cs:line 43

我猜是系统尝试将 rowversion 转换为 datetime 时发生的错误

这是我获取列表的方法

public static IList<Employee> getEmployees()
{
    using (ISession mySession = SessionFactory().OpenSession())
    {
        using (ITransaction myTransaction = mySession.BeginTransaction())
        {
            return mySession.CreateCriteria<Employee>().List<Employee>();
        }
    }
}

这是我的课

public class Employee {
    private int _id;
    private Rank _rank;
    private string _visa;
    private string _firstName;
    private string _lastName;
    private string _university;
    private DateTime _rowversion;
    public Employee() {
        EmployeeFunctionInProject = new List<EmployeeFunctionInProject>();
        Group = new List<Group>();
    }
    public virtual int Id {
        get {
            return this._id;
        }
        set {
            this._id = value;
        }
    }
    public virtual Rank Rank {
        get {
            return this._rank;
        }
        set {
            this._rank = value;
        }
    }
    public virtual string Visa {
        get {
            return this._visa;
        }
        set {
            this._visa = value;
        }
    }
    public virtual string FirstName {
        get {
            return this._firstName;
        }
        set {
            this._firstName = value;
        }
    }
    public virtual string LastName {
        get {
            return this._lastName;
        }
        set {
            this._lastName = value;
        }
    }
    public virtual string University {
        get {
            return this._university;
        }
        set {
            this._university = value;
        }
    }
    public virtual DateTime Rowversion {
        get {
            return this._rowversion;
        }
        set {
            this._rowversion = value;
        }
    }
    public virtual IList<EmployeeFunctionInProject> EmployeeFunctionInProject { get; set; }
    public virtual IList<Group> Group { get; set; }
}

这是我的地图

<hibernate-mapping assembly="MyWeb11" namespace="MyWeb11.Models" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Employee" table="EMPLOYEE" lazy="true" >
    <id name="Id" column="ID">
      <generator class="identity" />
    </id>
    <many-to-one name="Rank">
      <column name="RANK" sql-type="int" not-null="true" />
    </many-to-one>
    <property name="Visa">
      <column name="VISA" sql-type="varchar" not-null="true" unique="true" />
    </property>
    <property name="FirstName">
      <column name="FIRST_NAME" sql-type="varchar" not-null="true" />
    </property>
    <property name="LastName">
      <column name="LAST_NAME" sql-type="varchar" not-null="true" />
    </property>
    <property name="University">
      <column name="UNIVERSITY" sql-type="varchar" not-null="true" />
    </property>
    <property name="Rowversion">
      <column name="ROWVERSION" sql-type="timestamp" not-null="true" />
    </property>
    <bag name="EmployeeFunctionInProject" inverse="true">
      <key column="EMPLOYEE" />
      <one-to-many class="EmployeeFunctionInProject" />
    </bag>
    <bag name="Group" inverse="true">
      <key column="LEADER" />
      <one-to-many class="Group" />
    </bag>
  </class>
</hibernate-mapping>

我已经寻找解决方案,但没有找到。任何帮助表示赞赏。提前致谢!

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    我希望您使用的是 SQL Server,其中 timestamp 不是 DateTime 值。没有任何共同之处。见(最新名称为rowversion)-rowversion (Transact-SQL)

    是一种在数据库中公开自动生成的唯一二进制数的数据类型。 rowversion 通常用作对表行进行版本标记的机制。存储大小为 8 个字节。 rowversion 数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用 datetime2 数据类型。

    我的建议是,像您一样使用那种类型的列(行版本/时间戳),并结合 &lt;version&gt; 属性的 NHiberante 功能。见:

    有一个sn-p的映射:

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

    如果我们需要将二进制文件传递给客户端,我们可以将其转换为字符串属性,请参阅:

    作为 C# 代码的属性:

    protected virtual byte[] Timestamp { get; set; }
    public virtual string Version
    {
        get { return Timestamp.IsEmpty() ? null : Convert.ToBase64String(Timestamp); }
        set { Timestamp = value.IsEmpty() ? null : Convert.FromBase64String(value); }
    }
    

    【讨论】:

    • 谢谢!我从 private DateTime _rowversion 更改为 private byte[] _rowversion 并且它可以工作。
    • 很高兴看到这一点!我也使用相同的功能;)
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2014-07-16
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多