У меня возникли проблемы с уникальными ограничениями в NHibernate.
У меня есть сущность User, которая сопоставлена с уникальным ограничением для свойства Username. Что я хочу сделать, так это иметь возможность проверить, существует ли конкретное имя пользователя, до добавления нового пользователя, а также до того, как существующий пользователь обновит свое имя пользователя.
Первый сценарий (добавление нового пользователя) работает нормально. Однако, когда я пытаюсь проверить, существует ли имя пользователя перед обновлением существующего пользователя, я получаю нарушение ограничения. Вот как выглядит код моего метода Save.
public void Save<T>(T entity) where T : User
{
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
try
{
CheckIfUsernameExists(entity);
session.SaveOrUpdate(entity);
session.Flush();
transaction.Commit();
}
catch (HibernateException)
{
transaction.Rollback();
throw;
}
}
}
Ограничение нарушено в методе CheckIfUsernameExists () и выглядит это так:
public void CheckIfUsernameExists<T>(T entity) where T : User
{
var user = GetUserByUsername(entity);
if (user != null)
throw new UsernameExistsException();
}
private T GetUserByUsername<T>(T entity) where T : User
{
var username = entity.Username;
var idToExclude = entity.Id;
var session = GetSession();
var user = session.CreateCriteria<T>()
.Add(Restrictions.Eq("Username", username))
.Add(Restrictions.Not(Restrictions.IdEq(idToExclude)))
.UniqueResult() as T;
return user;
}
Это строка session.CreateCriteria (), которая вызывает сбой, в результате чего возникает исключение NHibernateException (SQLiteException) с сообщением «Прервать из-за нарушения ограничения. Имя пользователя столбца не уникально».
Связано ли это с наличными NHibernate? Сущность, переданная методу сохранения, была обновлена с желаемым именем пользователя во время вызова session.CreateCriteria ().
Возможно, я все делаю неправильно (я новичок в NHibernate), поэтому, пожалуйста, не стесняйтесь заявлять очевидное и предлагать альтернативы.
Любая помощь высоко ценится!