我在NHibernate中遇到了一些独特约束的麻烦。NHibernate的独特约束条件
我有一个用户实体映射到一个唯一的用户名属性约束。我想要做的是能够在新用户添加之前以及在现有用户更新用户名之前检查特定用户名是否存在。
第一种情况(添加一个新用户)工作得很好。但是,当我尝试在更新现有用户之前检查用户名是否存在时,我得到了违反约束的情况。以下是我的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的初学者),所以请随时陈述明显并提出替代方案。
任何帮助非常感谢!
回答你的问题是,我不知道。我已将代码更改为您的建议,但结果相同。感谢您的输入! – 2009-09-25 10:30:46
好的...我想你在你的数据库中的“用户名”col放置了一个唯一的约束?此外,我读到,你有“传递给保存方法的实体已更新所需的用户名在会议..”我不会这样做。我会在之前调用ExistsUsername,这样你也可以避免使用“idToAvoid”。 – Juri 2009-09-25 10:37:49
是的,数据库中有一个用户名限制。关于在更新实体之前调用ExistsUsername;这可能是一种可能性,但我需要进一步调查。谢谢。 – 2009-09-25 10:59:27