Certificação Microsoft 70-487: Objetivo 2.2 – Query and manipulate data by using Data Provider for Entity Framework

Olá pessoal! Continuando a série de posts sobre a certificação Microsoft 70-487, vamos ao objetivo 2.2, Query and manipulate data by using Data Provider for Entity Framework. Esse é um objetivo bem curto que fala sobre como fazer queries usando o namespace System.Data.EntityClient.

O namespace System.Data.EntityClient é um superset do namespace System.Data, e suas classes operam de forma bem similar. As diferenças se referem ao Entity Framework.

Em todos os cenários de acesso ao banco de dados, uma conexão é necessária. No namespace SqlClient, há a classe SqlConnection. Para o EntityClient, a classe de conexão é a EntityConnection. Ela tem três construtores: um vazio (new EntityConnection()), um que recebe uma connection string normal e o terceiro em que você deve especificar informações (metadados) para o EDM. Para fazer isso, a melhor maneira é usar a classe EntityConnectionStringBuilder em conjunto com a classe SqlConnectionStringBuilder:

String provider = "System.Data.SqlClient";
String serverName = "localhost";
String databaseName = "dbname";

SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder();
connBuilder.DataSource = serverName;
connBuilder.InitialCatalog = databaseName;

EntityConnectionStringBuilder efBuilder = new EntityConnectionStringBuilder();
efBuilder.Provider = Provider;
efBuilder.ProviderConnectionString = connBuilder.ToString();
efBuilder.Metadata = @"*csdl, *ssdl, *msl";
EntityConnection Connection = new EntityConnection(efBuilder.ToString());

O resto opera de forma bem igual à uma SqlConnection, como os métodos Open, Close e BeginTransaction.

O EntityCommand também trabalha como o SqlCommand. Há os métodos CreateParameter, ExecuteNonQuery, ExecuteReader e ExecuteScalar, por exemplo, e todos eles funcionam como sugerido. Todos eles também têm suas versões Async, onde a única diferença é a presença da propriedade CancellationToken.

Há também a classe EntityTransaction, que funciona também de forma idêntica à TransactionScope (explicada aqui).

Fazendo Transações

Há duas opções para se fazer transações diretamente.

A primeira é usando a classe DbTransaction. Você a obtém pelo DbContext, no método Database.Connection.BeginTransaction():

EntityFrameworkSamplesEntities Context = new EntityFrameworkSamplesEntities();
IDbTransaction TransactionInstance = Context.Database.Connection.BeginTransaction();
try
{
// Do Something
Context.SaveChanges();
TransactionInstance.Commit();
}
catch (EntityCommandExecutionException)
{
TransactionInstance.Rollback();
}

O próximo método, bem mais provável de se encontrar no exame, é pela classe TransactionScope. A vantagem dela é que você só precisa chamar o método Complete após SaveChanges; não é necessário nenhum tratamento especial em caso de falha:

EntityFrameworkSamplesEntities Context = new EntityFrameworkSamplesEntities();
using (TransactionScope CurrentScope = new TransactionScope())
{
try
{
Context.SaveChanges();
CurrentScope.Complete();
}
catch (EntityCommandExecutionException)
{
//Handle the exception as you normally would
//It won't be committed so transaction wise you're done
}
}

E isso é tudo para esse objetivo :) O próximo post será sobre o objetivo 2.3, Query data by using LINQ to Entities.

Até mais!