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: