使用生成的属性NHibernate备用ID

问题描述

| **此问题已过编辑,使其更简单,更集中** Employee有一个EmployeeNumberValue属性,我希望该属性由数据库自动递增。对于业务域,这是分配给员工的唯一ID,用于在员工卡等上标识他们。但是,对于数据库,它是备用ID,而不是主键。 NHib具有记录的功能,称为“生成的属性”。 根据文档,\“生成的属性是具有其值由数据库生成的属性。通常,NHibernate应用程序需要刷新对象,这些对象包含数据库为其生成值的任何属性。但是,将属性标记为已生成,则可以让应用程序委托本质上,每当NHibernate对已定义生成属性的实体发出SQL INSERT或UPDATE时,NHibernate都会立即发出选择以检索生成的值。\“ 我遇到的问题是,尽管NHib进行了其他SELECT更新EmployeeNumberValue,但它没有将检索到的值分配给该属性。 谁能知道为什么会这样吗? 干杯, 贝里 失败的测试和输出(在内存数据库中通过SQLite进行了测试):
    [Test]
    public void Employee_OnInsert_EmployeeNumberValueIsIncremented() {

        var emp1 = new Employee
        {
            FullName = _fullName,Department = _department,};
        var emp2 = new Employee
        {
            FullName = _fullName,};

        var session = _SessionFactory.GetCurrentSession(); 

        using (var tx = session.BeginTransaction())
        {
            session.Save(_department);
            session.Save(emp1);
            session.Save(emp2);
            tx.Commit();
        }
        Assert.That(emp1.EmployeeNumberValue,Is.EqualTo(1));
        Assert.That(emp2.EmployeeNumberValue,Is.EqualTo(2));
    }

NHibernate: INSERT INTO Employees (FirstName,LastName,DepartmentId,EmployeeId) 
        VALUES (@p0,@p1,@p2,@p3);@p0 = \'Berryl\' [Type: String (0)],@p1 = \'Hesh\' [Type: String (0)],@p2 = 32768 [Type: Int32 (0)],@p3 = 65536 [Type: Int32 (0)]
NHibernate: SELECT employee_.EmployeeNumberValue as Employee2_1_ FROM Employees employee_ WHERE employee_.EmployeeId=@p0;@p0 = 65536 [Type: Int32 (0)]
NHibernate: INSERT INTO Employees (FirstName,@p3 = 65537 [Type: Int32 (0)]
NHibernate: SELECT employee_.EmployeeNumberValue as Employee2_1_ FROM Employees employee_ WHERE employee_.EmployeeId=@p0;@p0 = 65537 [Type: Int32 (0)]
Test failed: 
   Expected: 1
   But was:  0
对象模型
public class Employee : Entity,IResource
{
    public virtual long EmployeeNumberValue { get; set; }

    ...
}
映射:
  <class name=\"Employee\" table=\"Employees\">

<id name=\"Id\" unsaved-value=\"0\">
  <column name=\"EmployeeId\" />
  <generator class=\"hilo\" />
</id>

<property name=\"EmployeeNumberValue\" generated=\"insert\" insert=\"false\" update=\"false\" >
  <column name=\"EmployeeNumberValue\" sql-type=\"int IDENTITY(1,1)\" index=\"IDX_EmployeeNumber\"  />      
</property>

...
create table Employees (
    EmployeeId INTEGER not null,EmployeeNumberValue int IDENTITY(1,1),FirstName TEXT not null,LastName TEXT not null,DepartmentId INTEGER,primary key (EmployeeId)
)
我怀疑将列标记为IDENTITY的方式也令人怀疑。我尝试如下使用数据库对象,但这样做时出现使用错误
  <database-object>
    <create>
      ALTER TABLE Employee DROP COLUMN EmployeeNumberValue
      ALTER TABLE Employee ADD EmployeeNumberValue INT IDENTITY
    </create>
    <drop>
      ALTER TABLE Employee DROP COLUMN EmployeeNumberValue
    </drop>
  </database-object>

SQLiteException : SQLite error  \"DROP\": syntax error
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)