Обработка составных первичных ключей в прослушивателях событий NHibernate - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь извлечь имя свойства первичного ключа и значение исходного объекта из прослушивателя событий NHibernate, и я хочу, чтобы он мог обрабатывать составные первичные ключи.

Проблема, с которой я столкнулсяИмеется в том, что в моем обработчике событий при работе с составным первичным ключом свойство Id инициируемого события, похоже, связывается с всей исходной сущностью:

Compound primary key getting bound to original entity

Как получить по исходному идентификатору имена свойств и соответствующие значения?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я бы использовал следующий код для компонентов:

if (@event.Persister.IdentifierType.IsComponentType)
{
    var componentType = (IAbstractComponentType) @event.Persister.IdentifierType;
    var values = componentType.GetPropertyValues(@event.Id);
    var propertyNames = componentType.PropertyNames;
    for (int i = 0; i < values.Length; i++)
    {
        Console.WriteLine($"PropertyName: {propertyNames[i]}, Value: {values[i]}");
    }
}
0 голосов
/ 30 октября 2019
if (@event.Persister.IdentifierType is NHibernate.Type.EmbeddedComponentType identifierType)
{
    // This entity has a composite primary key.

    foreach (var propertyName in identifierType.PropertyNames)
    {
        // Because we only have the name of the property we have to use reflection to get
        // the corresponding value.
        object propertyValue = @event.Id.GetType().GetProperty(propertyName).GetValue(entityId);
    }
}
...