14 de dezembro de 2011, por Denis Ferrari em Herocast

Fala Pessoal, tudo bom? O Herocast dessa semana aborda um tema muito bacana: A tradução de um modelo uml em código e seu respectivo mapeamento utilizando o Fluent NHibernate. O Objetivo é apresentar uma visão geral sobre os dois temas, dar algumas dicas e simplificar conceitos que parecem complicados de início. Espero que gostem!

Diagrama de classes pelo mestre Macoratti

FluentNHibernate.org

Diagrama utilizado

Classe Comentário

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Comentario
{
	public int Id { get; set; }
 
	public string Nome { get; set; }
 
	public string Email { get; set; }
 
	public string Mensagem { get; set; }
 
	public Conteudo Conteudo { get; set; }
}
 
public class ComentarioMap : ClassMap<Comentario>
{
	public ComentarioMap()
	{
		// Chave primária.
		Id(m => m.Id); 
 
		Map(m => m.Nome)
			// Campo obrigatório.
			.Not.Nullable(); 
 
		Map(m => m.Email)
			.Not.Nullable();
 
		Map(m => m.Mensagem)
			.Not.Nullable()
			// Comprimento do campo.
			.Length(2000); 
 
		// Lado 1 do mapeamento 1xN.
		References(m => m.Conteudo);
	}
}

Classe Autor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Autor
{
	public int Id { get; set; }
 
	public string Nome { get; set; }
 
	public IList<Conteudo> Conteudos { get; set; }
 
	public Autor()
	{
		this.Conteudos = new List<Conteudo>();
	}
}
 
public class AutorMap : ClassMap<Autor>
{
	public AutorMap()
	{
		Id(m => m.Id);
 
		Map(m => m.Nome)
			.Not.Nullable();
 
		// Lado N do mapeamento 1xN.
		HasMany(m => m.Conteudos);
	}
}

Classe Categoria

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Categoria
{
	public string Id { get; set; }
 
	public string Nome { get; set; }
 
	public string Descricao { get; set; }
 
	public IList<Conteudo> Conteudos { get; set; }
 
	public Categoria()
	{
		this.Conteudos = new List<Conteudo>();
	}
}
 
public class CategoriaMap : ClassMap<Categoria>
{
	public CategoriaMap()
	{
		Id(m => m.Id);
 
		Map(m => m.Nome)
			.Not.Nullable();
 
		Map(m => m.Descricao);
 
		// Mapeamento NxN.
		HasManyToMany(m => m.Conteudos);
	}
}

Classe Conteúdo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class Conteudo
{
	public int Id { get; set; }
 
	public string Titulo { get; set; }
 
	public string Corpo { get; set; }
 
	public Status Status { get; set; }
 
	public IList<Categoria> Categorias { get; set; }
 
	public Autor Autor { get; set; }
 
	public IList<Comentario> Comentarios { get; set; }
 
	public Conteudo()
	{
		this.Categorias = new List<Categoria>();
		this.Comentarios = new List<Comentario>();
	}
}
 
public class ConteudoMap : ClassMap<Conteudo>
{
	public ConteudoMap()
	{
		Id(m => m.Id);
 
		Map(m => m.Titulo)
			.Not.Nullable();
 
		Map(m => m.Corpo);
 
		Map(m => m.Status);
 
		References(m => m.Autor)
			// Não realiza alterações na referência.
			.Cascade.None();
 
		HasManyToMany(m => m.Categorias)
			// Pode criar e atualizar as referências.
			.Cascade.SaveUpdate();
 
		HasMany(m => m.Comentarios)
			// Controle total sobre as referências, inclusive exclusões.
			.Cascade.All();
	}
}

Classe Notícia

1
2
3
4
5
6
7
8
9
10
public class Noticia : Conteudo
{
 
}
 
// SubclassMap representa a herança.
public class NoticiaMap : SubclassMap<Noticia>
{
 
}

Se gostou do vídeo, ajude a divulgar! :)

Abraços!


Comentários:
13 Comentários postados em "HeroCast 08 – Uml e Fluent NHibernate"
Victor on dezembro 15th, 2011 at 11:05 #

Muito Bom mano.
Show de bola.


Roberto Cesar Rodrigues on dezembro 18th, 2011 at 21:42 #

Cara esse seu post (assim como os outros) foram de extrema utilidade, mas esse Você acertou em cheio. Parabéns e muito obridado!


Rodrigo Ferro on janeiro 1st, 2012 at 11:29 #

Parabens, ficou claro e objetivo.. Excelente conteudo ! Continue assim !


Cleyton Ferrari on março 26th, 2012 at 2:44 #

Já acompanho seu vídeo há algum tempo, parabens e obrigado por compartilhar o conhecimento. E gostei da parte “Qualquer forma de comunicação que funcione é valida”, leva tempo para quem esta começando entender que o importante é que funcione!


Denis Ferrari on abril 14th, 2012 at 16:45 #

Realmente, alguns entendimentos simples só chegam com o tempo mesmo.

Obrigado pelo feedback!

Abraços


Américo Arvani on abril 19th, 2012 at 0:34 #

Muíto bom Denis, muito esclarecedor . Valeu mesmo!


Jackson Faria on maio 3rd, 2012 at 15:20 #

Olá Denis, você conhece algum aplicativo que já gere as classes de mapeamento automaticamente? Conheço o NHibernate Mapping Generator, mas ele tem um problema quando a chave da tabela é composta por chaves estrangeiras.

Abraço, bom conteúdo.


Denis Ferrari on maio 21st, 2012 at 11:54 #

Olá Jackson,

Não conheço, geralmente não gosto desse tipo de ferramentas no meu ciclo de trabalho.

Abraços e obrigado pelo feedback.


Tiago on maio 31st, 2012 at 12:20 #

Muito didático.
Denis, tenho uma dúvida.
Para carregar os mapeamentos você usou o CategoriaMap, poderia usar qualquer outro mapeamento ?


Felipe on junho 4th, 2012 at 2:25 #

Muito du bão-sô… parabéns-sô


Denis Ferrari on junho 4th, 2012 at 16:12 #

Oi Tiago,

Sim. Isso é um atalho. Você poder usar qualquer classe da dll onde estejam seus mapeamentos.

Abraços!


Davi on junho 11th, 2012 at 16:00 #

Coloca aí como ficou o diagrama gerado no banco, como forma de comparativo com o diagrama de classes e se o resultado é o parecido ou aproximado com o esperado.


Denis Ferrari on junho 29th, 2012 at 15:05 #

O Diagrama não precisa ter correlação direta com o Uml. São coisas diferentes, você pensa no Uml e também pensa no banco, mas a relação não é um para um.


Deixe um comentário

Nome: 
Email: 
URL: 
Comentário: