NHibernate의 고유 한 제약 조건에 문제가 발생했습니다.NHibernate unique constraints
나는 사용자 이름 속성에 대한 고유 제한 조건으로 매핑되는 사용자 엔터티가 있습니다. 내가하고 싶은 일은 새로운 사용자가 추가되기 전에 특정 사용자 이름이 존재하는지 확인하고 기존 사용자가 사용자 이름을 업데이트하기 전에 확인할 수 있습니다.
첫 번째 시나리오 (새 사용자 추가)는 정상적으로 작동합니다. 그러나 기존 사용자를 업데이트하기 전에 사용자 이름이 존재하는지 확인하려고하면 제약 조건 위반이 발생합니다. 내 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;
}
그것은 그것이 NHibernateException의 결과로 충돌의 원인이되는 session.CreateCriteria() 라인 (SQLiteException) "제약 조건 위반으로 인해 중단되었습니다. 열 사용자 이름이 고유하지 않습니다"라는 메시지가 표시됩니다.
NHibernate 현금과 관련이 있습니까? save 메서드에 전달 된 엔터티는 session.CreateCriteria()가 호출 될 때 원하는 사용자 이름으로 업데이트되었습니다.
어쩌면 나는이 모든 잘못을하고있다. (나는 NHibernate 초보자 다.) 어쩌면 명백한 것을 제시하고 대안을 제안 할 수있다.
도움을 주시면 감사하겠습니다.
, 내가하지 않습니다. 내가 제안한 코드를 변경했지만 그 결과는 같습니다. 의견을 보내 주셔서 감사합니다! –
ok ...DB의 "username"col에 고유 한 제한 조건을 두었습니다. 또한 나는 당신이 "저장 메소드에 전달 된 엔티티가 세션 시간에 원하는 사용자 이름으로 업데이트되었습니다."라고 읽었습니다. 나는 그렇게하지 않을 것입니다. ExistsUsername을 호출하기 전에 "idToAvoid"를 피할 수도 있습니다. – Juri
예, username에는 db에 제약 조건이 있습니다. 엔터티를 업데이트하기 전에 ExistsUsername을 호출하는 것에 관해서; 그것은 가능성일지도 모르지만 나는 더 조사 할 필요가있을 것이다. 감사. –