Um dos novos recursos disponíveis no Entity Framework 6 é a possibilidade de criar novas instâncias de contexto utilizando uma instância de DbConnection ativa. Operações que mesclam comandos em ADO.Net e com o Entity Framework podem fazer uso deste recurso.
No Entity Framework 6, a classe DbContext ganhou novas assinaturas para seus construtores, permitindo o uso de uma instância ativa de DbConnection para criação de um novo contexto. Para ver todos os construtores disponíveis na classe DbContext acesse este link: http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx
Para essa demonstração utilizaremos o seguinte construtor:
public DbContext (
DbConnection existingConnection,
bool contextOwnsConnection
)
Esse construtor exige a passagem de dois parâmetros, sendo eles: existingConnection, instância ativa de um DbConnection que será utilizado para todas operações realizadas pelo DbContext; e contextOwnsConnection, booleano que indica se o DbConnection passado por parâmetro pode ser destruído quando a instância do DbContext for destruída ou se sua instância deve ser mantida ativa após a destruição da instância de DbContext.
A documentação oficial deste construtor pode ser acessada por este link: http://msdn.microsoft.com/en-us/library/gg696604(v=vs.103).aspx
Exemplo
Para demonstrar o uso de instâncias ativas de DbConnections na construção de novas instâncias de DbContexts, utilizaremos uma entidade com uma estrutura bastante simples, como pode ser visto abaixo.
O código necessário para criação dessa estrutura esta disponível a seguir:
public class CustomInfo {
public int Id { get ; set ; }
public Guid GlobalId { get ; set ; }
public string Content { get ; set ; }
}
O contexto do Entity Framework a ser utilizado deverá expor em seu construtor recursos que permitam a passagem da instância ativa de um DbConnection. O exemplo abaixo demonstra exatamente isso. Note que um dos construtores do contexto expõe um DbConnection e um booleano como parâmetros, assim como discutido anteriormente. Vale ressaltar também que só passar os parâmetros não é suficiente, também é preciso encaminhar os valores destes parâmetros para a classe base.
public class DataContext : DbContext {
public DbSet<CustomInfo> CustomInfo { get; set; }
public DataContext(string connectionString)
: base(connectionString) {
InitializeContext();
}
public DataContext()
: base("Key name on App.Config/Web.Config") {
InitializeContext();
}
public DataContext(DbConnection connection, bool contextOwnsConnection)
: base(connection, contextOwnsConnection) {
InitializeContext();
}
private void InitializeContext() {
Database.SetInitializer<DataContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<CustomInfo>().ToTable("CustomInfo");
base.OnModelCreating(modelBuilder);
}
}
Na estrutura deste contexto podemos notar a existência de três construtores distintos, onde um destes construtores é próprio para a demonstração de uso de um DbConnection ativo para execução de comandos com um DbContext do Entity Framework.
Abaixo temos o exemplo de uso de um DbContext com um DbConnection ativo. Note que estamos criando o DbConnection dentro de um bloco USING e passando o valor FALSE para o parâmetro "contextOwnsConnection", indicando que o DbContext não ficará responsável pela destruição da instância de DbConnection.
string connectionString = "Your connection string...";
const string ICOMMAND = "INSERT INTO CustomInfo (GlobalId, Content) VALUES (@GlobalId, @Content)";
var info = new CustomInfo();
info.GlobalId = Guid.NewGuid();
info.Content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
using (DbConnection conn = new SqlConnection(connectionString)) {
var sqlCommand = conn.CreateCommand();
sqlCommand.CommandText = ICOMMAND;
sqlCommand.CommandType = CommandType.Text;
sqlCommand.Parameters.Add(new SqlParameter("GlobalId", info.GlobalId));
sqlCommand.Parameters.Add(new SqlParameter("Content", info.Content));
conn.Open();
sqlCommand.ExecuteNonQuery();
using (var context = new DataContext(conn, true)) {
var query = from c in context.CustomInfo
where c.GlobalId == info.GlobalId
select c;
foreach (var resultItemQuery in query) {
Console.WriteLine(resultItemQuery.Content);
}
}
conn.Close();
}
Espero que esse conteúdo seja útil.
Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#
Referências:
http://msdn.microsoft.com/en-us/library/gg696604(v=vs.103).aspx
http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.dbcontext(v=vs.103).aspx
http://blogs.msdn.com/b/adonet/archive/2013/08/21/ef6-release-candidate-available.aspx
Muito massa! Essa funcionalidade veio na hora certa! Parabéns, amigo
Vlw Yan! Obrigado por postar! []s!
Obrigado pelo post, você tem o link no github deste exemplo?
Abs