2013-04-14 3 views
0

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

1) Проверьте, если объект существует на поле, кроме ID

2) Если нет, то создать объект

Проблема заключается в это в консольного приложения, что является многопоточным, поэтому мне нужно каким-то образом получить объект по полю, отличному от идентификатора, и установить LockMode для обновления (или, по крайней мере, я думаю, что это нужно сделать). Из того, что я вижу, нет способа сделать это с ISession.

Любые идеи?

+0

Есть ли ограничение уникальности на поле? –

+0

Нет, но я согласен, должно быть. – jason

ответ

0

в едином процессе использования глобальной lockobject

lock(existsLocker) 
{ 
    var entity = session.Query<Entity>().Where(...).FirstOrDefault(); 
    if (entity == null) 
    { 
     entity = new Entity(); 
     session.Save(entity); 
     session.Flush(); 
    } 
} 
+0

Это не работает, если было запущено несколько консольных приложений ... Это то, что я сделал до тех пор, пока не выясню, как обращаться с nhibernate/database. Что может быть самым простым способом, это хранимая процедура, которая выполняет проверку и вставляет одну транзакцию. – jason

+0

yes sproc, вероятно, самый простой способ после Unique Constraint. Другой вариант - синхронизировать значение в db и использовать оптимистичный параллелизм для просмотра конфликтов. – Firo

Смежные вопросы