Как использовать свойство Version для NServicebus NHibernate Saga Persister?

Простите меня за вопрос, на который может быть совершенно очевидный ответ (RTFM), но как сделать так, чтобы «свойство версии» упоминалось здесь действительно работают? Предоставленные ссылки на сайт Ayende здесь и репозиторий github здесь намекают, что это возможно. Существует также другая ссылка SO здесь, которая описывает ту же проблему, но не действительно есть четкое решение. Мне также не удалось найти пример кода NSB или что-либо в примечаниях к выпуску или документации, связанной с этой функцией. Тем не менее, это критически важное знание для всех, кто запускает саги с несколькими рабочими потоками и ReadCommited.

Действительно ли это так же просто, как добавить целочисленное свойство Version к вашему классу данных саги и метку времени/строку к вашей таблице данных саги? Это действительно где-то в образцах, и я просто не там ищу?

Кроме того, основываясь на комментариях, которые я видел, похоже, что в NSB 3.x есть ошибка, связанная с этой функцией. Нужно ли мне обновляться до 4.x, чтобы получить эту функцию, или есть простой способ заставить ее работать в 3.x?

Спасибо!

ИЗМЕНИТЬ:

Используя ответ Джона Саймона ниже, я столкнулся с ошибкой, первоначально используя следующие версии NSB:

NHibernate: 3.3.3.4001
NServiceBus: 4.3.1
NServiceBus.Host: 4.3.1
NServiceBus.Interfaces: 4.3.3
NServiceBus.NHibernate: 4.3.0
NServiceBus.StructureMap: 4.3.1

Я открыл эту задачу на github и после некоторых возвратов попробовал build, содержащий исправление, и заставил это работать. Официальное исправление было выпущено в NServiceBus.NHibernate v4.4.0.

Мой вариант ответа состоял в том, чтобы использовать это со столбцом SQL с отметкой времени:

[RowVersion]
public virtual byte[] Version { get; set; }

Потратив пару дней на это, он выглядит хорошо.


person killthrush    schedule 24.12.2013    source источник


Ответы (1)


В v3 все, что вам нужно сделать, это определить свойство версии в саге:

public virtual int Version {get;set;}

В v4 мы по умолчанию используем модель параллелизма «оптимистичный-все», и если вам нужен настраиваемый параллелизм на уровне строк, вы делаете то же самое, что и v3 + атрибут:

[RowVersion]
public virtual int Version { get; set; }
person John Simons    schedule 26.12.2013
comment
Спасибо! просто для ясности, в SQL Server это должен быть столбец метки времени или столбец rowversion? По словам Айенде, это похоже на метку времени, однако я бы предпочел использовать версию строки, потому что первая устарела. Я попробую это сегодня и посмотрю, смогу ли я запустить его. - person killthrush; 27.12.2013
comment
О, еще одна вещь, во втором примере кода вы имели в виду параллелизм на уровне поля для варианта использования при добавлении атрибута? Из того, что я читал на github (github.com/Particular/NServiceBus/issues/1084) уровень строки является значением по умолчанию. - person killthrush; 27.12.2013
comment
Обновленный ответ для уточнения модели параллелизма, используемой по умолчанию в версии 4. - person John Simons; 30.12.2013
comment
Наконец-то смог вернуться к этому. У меня чертовски много времени, чтобы заставить это работать. Я пробовал кучу комбинаций, чтобы попытаться избежать всех исключений приведения, но не повезло. Я пробовал опубликованный выше пример с отметкой времени и столбцом int в SQL как с нулевым, так и с нулевым значением. Я пробовал DateTime и byte[] в классе данных саги С# со столбцом метки времени. Конечно, это не должно быть так сложно... Я обновил свой вопрос, чтобы уточнить - person killthrush; 05.02.2014
comment
@killthrush, вы можете поднять вопрос на github.com/Particular/NServiceBus.NHibernate/issues/ новый - person John Simons; 08.02.2014