NHibernate Mapping by Code – Definindo um campo como Unique

Eu comecei um projeto recentemente utilizando o NHibernate e tenho gostado bastante dele. Resolvi criar este post mais como lembrete para mim mesmo, pois tive um pequeno probleminha ao refatorar o modelo e passar a definir um campo como Unique. O problema era que mesmo definindo o campo como Unique, ele não atualizava o schema. O problema é que quando você faz essas alterações, o schemaUpdate não resolve, e você precisa matar a sua base e criá-la de novo (não sei se há outra alternativa, porém foi a que eu achei).

Mapeando um model com um campo unique:

    public class User
    {
        public virtual Guid Id { get; set; }

        [Required(ErrorMessage="O campo Nome é obrigatório")]
        [Display(Name = "Nome")]
        public virtual string FirstName { get; set; }

        [Required(ErrorMessage="O campo Sobrenome é obrigatório")]
        [Display(Name = "Sobrenome")]
        public virtual string LastName { get; set; }

        [Required(ErrorMessage="O campo Apelido é obrigatório")]
        [Display(Name = "Apelido")]
        public virtual string Nick { get; set; }

        [Required(ErrorMessage="O campo Email é obrigatório")]
        [Display(Name = "Email")]
        public virtual string Email { get; set; }

        public User()
        {
        }

        public virtual string GetFullName()
        {
            return string.Format("{0} {1}", FirstName, LastName);
        }

        public virtual string GetFullNameWithNick()
        {
            return string.Format("{0} '{1}' {2}", FirstName, Nick, LastName);
        }
    }

    public class UserMap : ClassMapping<User>
    {
        public UserMap()
        {
            Id(x => x.Id, m => m.Generator(Generators.GuidComb));
            Property(x => x.Email, m => {
                m.NotNullable(true);
                m.Unique(true);
                m.UniqueKey("Email");
            });
            Property(x => x.FirstName, m => m.NotNullable(true));
            Property(x => x.LastName, m => m.NotNullable(true));
            Property(x => x.Nick);
        }
    }

Para garantir que nosso email será único, vamos criar um teste para isso.

    [TestFixture]
    class UserRepositoryTest
    {
        private IUserRepository _personRepo;

        [SetUp]
        public void CreateSchema()
        {
            DeleteDatabaseIfExists();

            var schemaUpdate = new SchemaUpdate(NHibernateHelper.Configuration);
            schemaUpdate.Execute(false, true);

            _personRepo = new UserRepository();
        }

        [Test]
        [ExpectedException()]
        public void CantInsertDuplicatedEmail()
        {
            var user = new User
            {
                Email = "teste555555@teste.com.br",
                FirstName = "Teste",
                LastName = "Teste",
            };
            _personRepo.Save(user);
            user = new User
            {
                Email = "teste555555@teste.com.br",
                FirstName = "Teste",
                LastName = "Teste",
            };
            _personRepo.Save(user);
        }

        [TearDown]
        public void DeleteDatabaseIfExists()
        {
            var schema = new SchemaExport(NHibernateHelper.Configuration);
            schema.Drop(false, true);
            schema.Create(true, true);
        }

Pronto, agora podemos garantir que o schema foi atualizado e que nosso email agora é único 😉

Abraços

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s