Tengo un objeto de modelo de cuenta y una restricción ÚNICA en el nombre de la cuenta. En Domain Driven Design, usando nHibernate, ¿cómo debo verificar la unicidad del nombre antes de insertar o actualizar una entidad?¿Cómo verificar la violación de restricción única en nHibernate y DDD antes de guardar?
No deseo confiar en una excepción nHibernate para detectar el error. Me gustaría devolver un mensaje de error más bonito a mi usuario que el could not execute batch command.[SQL: SQL not available]
oscuro
En la pregunta Where should I put a unique check in DDD?, alguien sugirió usar una especificación como tal.
Account accountA = _accountRepository.Get(123);
Account accountB = _accountRepository.Get(456);
accountA.Name = accountB.Name;
ISpecification<Account> spec = new Domain.Specifications.UniqueNameSpecification(_accountRepository);
if (spec.IsSatisfiedBy(accountObjA) == false) {
throw new Domain.UnicityException("A duplicate Account name was found");
}
con el código de especificación como:
public bool IsSatisfiedBy(Account obj)
{
Account other = _accountRepository.GetAccountByName(obj.Name);
return (other == null);
}
Esto funciona para inserciones, pero no cuando se hace una actualización debido. He intentado cambiar el código para:
public bool IsSatisfiedBy(Account obj)
{
Account other = _accountRepository.GetAccountByName(obj.Name);
if (obj == null) { // nothing in DB
return true;
}
else { // must be the same object.
return other.Equals(obj);
}
}
El problema es que NHibernate emitirá una actualización de la base de datos cuando se ejecuta GetAccountByName()
para recuperar un posible duplicado ...
return session.QueryOver<Account>().Where(x => x.Name == accntName).SingleOrDefault();
Así que, ¿qué debo ¿hacer? ¿Es la especificación no la forma correcta de hacerlo?
Gracias por su opinión!
Gracias Thilak, voy a echar un vistazo a 'ISQLExceptionConverter'. Encontré [esta publicación en el blog] (http://fabiomaulo.blogspot.com/2009/06/improving-ado-exception-management-in.html) y [esta otra pregunta] (http://stackoverflow.com/questions)/1524167/custom-exception-using-nhibernate-isqlexceptionconverter) para ayudar con 'ISQLExceptionConverter' – dstj