我在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