Pílula de Entity Framework 4 - Usando Mestre-Detalhes (Eager Loading)


Que tal usar os recursos do Entity Framework 4 em uma aplicação Windows Forms ?

Suponha que você deseja criar uma aplicação Windows Forms para exibir os dados de duas tabelas relacionados em um controle DataGridView usando o Entity Framework ?

É um cenário clássico e para este exemplo eu vou usar as tabelas Categories e Products do banco de dados Northwind.mdf (o nosso saco de pancadas)

Desejamos exibir em um controle DataGridView as Categorias e em outro DataGridView os Produtos de forma que ao selecionar uma categoria os seus produtos relacionados sejam exibidos no segundo DataGridView.

Eu vou usar o Visual Studio 2010 Express e criar uma aplicação Windows Forms usando a linguagem Visual Basic com o nome ef4_MestreDetalhes;

Em seguida no menu Project clique em Add New Item e selecione o template ADO .NET Entity Data Model e informe o nome Northwind.edmx;

A seguir selecione a opção Generate From DataBase e clique Next>;

Agora selecione a conexão com o banco de dados Northwind.mdf e defina o nome da string de conexão como NorthwindEntities e clique em Next>;

Na próxima janela selecione as tabelas Categories e Products, marque a opção Pluralize or singularize generated object names e informe o nome NorthwindModel clicanco em Finish;

Obs: Esta opção é nova no EF 4.0  e permite que os nomes das entidades sejam gerados de forma mais correta.

Ao final será gerado o modelo de entidades mapeadas pelo Entity Framework conforme a figura abaixo para as tabelas Categories e Products;

Vamos agora incluir um Data Source no projeto no menu Data -> Add New Data Source;

Na próxima janela selecione a opção Object;

Em expanda o namespace ef4_MestreDetalhes e selecione o item NorthwindEntities e clique em Finish;

 

Após terminar esta etapa selecione o formulário padrão form1.vb na janela Solution Explorer e exiba a janela Data Source;

 

Agora arraste e solte os objetos Categories e Products para o formulário conforme a figura abaixo;

 

 

Se você tentar rodar o projeto neste momento não vai obter nenhum resultado. Precisamos incluir o código que atribui a coleção Categories a propriedade DataSource do controle BindingSource tanto para Categories como para Products.

 

Abra a janela de código e digite o código abaixo :

 

'cria uma instância do contexto
Private NorthwindContext As New NorthwindEntities

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 'O método include retorna todos os objetos Produtos relacionados a Categorias
 Dim dataSource = NorthwindContext.Categories.Include("Products")

 Dim i As Integer = NorthwindContext.Categories.Count

 'Vamos definir a fonte de dados primária que será Categories
 CategoriesBindingSource.DataSource = dataSource

 
'A fonte de dados Products atribuimos o CategoriesBindingSource control
 'o qual contém tanto Categorias como Produtos

 ProductsBindingSource.DataSource = CategoriesBindingSource

 
'E para exibir somente os produtos uso a propriedade DataMember
 ' atribuindo a ele o nome da coleção - Products

 ProductsBindingSource.DataMember = "Products"

 
'permite a inclusão de novos registros
 ProductsBindingSource.AllowNew = True

End Sub


Neste código após criar a instância do nosso Contexto estamos invocando o método Include de forma a poder carregar os Produtos das Categorias (eager loading).

 

Eager Load é o mecanismo pelo qual uma associação, coleção ou atributo é carregado imediatamente quando o objeto principal é carregado. (É o contrário do Lazy Loading)

No Entity Framework o eager load é obtido explicitamente por meio da função Include.Se eu não usar include os produtos não serão carregados de imediato.

Executando o projeto iremos obter:

Você poderá navegar pelas Categorias obtendo os produtos relacionados e poderá alterar e incluir dados diretamente no DataGridView (pelo menos os não relacionados).

Não é uma forma muito aconselhável de implementar a manutenção de dados mas é uma opção que pode ser realizada usando o Entity Framework.

Pegue o projeto completo aqui: ef4_MestreDetalhes.zip

Aguarde mais artigos sobre Entity Framework.

Referências:


José Carlos Macoratti