** Этот вопрос был отредактирован, чтобы сделать его более простым и целенаправленным **
У сотрудника есть свойство EmployeeNumberValue, которое я хотел бы автоматически увеличивать с помощью db. Для бизнес-домена это уникальный идентификатор, назначаемый сотрудникам и используемый для их идентификации на карточках сотрудников и т. Д. Однако для базы данных это альтернативный идентификатор, а не первичный ключ.
NHib имеет задокументированную возможность под названием сгенерированные свойства. Согласно документам, «сгенерированные свойства - это свойства, значения которых генерируются базой данных. Как правило, приложениям NHibernate необходимо обновить объекты, которые содержат любые свойства, для которых база данных генерировала значения. Пометка свойств как сгенерированные, однако, позволяет приложению делегировать это ответственность перед NHibernate. По сути, всякий раз, когда NHibernate выдает SQL INSERT или UPDATE для объекта, который определил сгенерированные свойства, он сразу же после этого выдает select для получения сгенерированных значений ».
Проблема, с которой я столкнулся, заключается в том, что пока NHib выполняет дополнительный SELECT для обновления EmployeeNumberValue, он не присваивает полученное значение свойству.
Кто-нибудь может понять, почему это происходит, и что это за исправление?
Ура,
Беррил
НЕИСПРАВНОСТЬ ТЕСТА И ВЫВОДА (проверено с SQLite в памяти db):
[Test]
public void Employee_OnInsert_EmployeeNumberValueIsIncremented() {
var emp1 = new Employee
{
FullName = _fullName,
Department = _department,
};
var emp2 = new Employee
{
FullName = _fullName,
Department = _department,
};
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, LastName, DepartmentId, EmployeeId)
VALUES (@p0, @p1, @p2, @p3);@p0 = 'Berryl' [Type: String (0)], @p1 = 'Hesh' [Type: String (0)], @p2 = 32768 [Type: Int32 (0)], @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)
)
I suspect the way I am marking the column as IDENTITY is also suspect. I tried using database-object as below, but got a usage error in doing so
<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
<property name="Value" column="EmployeeNumber" generated="insert"/>
. Вы сделали эту колонкуidentity
? - person Diego Mijelshon   schedule 01.06.2011public virtual long EmployeeNumber { get; set; }
в Employee с отображением, которое я вам дал, и он будет работать. - person Diego Mijelshon   schedule 02.06.2011IPreInsertEventListener
, используйте запрос для получения максимального значения, обычный прием, наблюдаемый в слушателях аудита, для изменения значения свойства ... и наблюдайте, как умирает масштабируемость вашего приложения. - person Diego Mijelshon   schedule 02.06.2011