Cadeias de conexão e modelos
Este artigo aborda como o Entity Framework descobre qual conexão de banco de dados usar e como alterá-la. Os modelos criados com o Code First e o EF Designer são abordados.
Aviso
Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Normalmente, um aplicativo do Entity Framework usa uma classe derivada de DbContext. Essa classe derivada chama um dos construtores na classe base DbContext para controlar:
- Como o contexto se conecta a um banco de dados, ou seja, como uma cadeia de conexão é encontrada e usada.
- Se o contexto calcula um modelo usando o Code First ou carrega um modelo criado com o Designer EF.
- Opções avançadas adicionais
Os fragmentos a seguir mostram algumas das maneiras pelas quais os construtores do DbContext podem ser usados.
Usar o Code First com conexão por convenção
Caso não tenha feito nenhuma outra configuração no aplicativo, chamar o construtor sem parâmetros em DbContext fará com que o DbContext seja executado no modo Code First com uma conexão de banco de dados criada por convenção. Por exemplo:
namespace Demo.EF
{
public class BloggingContext : DbContext
{
public BloggingContext()
// C# will call base class parameterless constructor by default
{
}
}
}
Neste exemplo, o DbContext usa o nome qualificado do namespace de sua classe de contexto derivada, Demo.EF.BloggingContext, como o nome do banco de dados e cria uma cadeia de conexão para esse banco de dados com o SQL Express ou o LocalDB. Caso ambos estejam instalados, o SQL Express será usado.
O Visual Studio 2010 inclui o SQL Express por padrão e o Visual Studio 2012 e posterior inclui o LocalDB. Durante a instalação, o pacote NuGet EntityFramework verifica qual servidor de banco de dados está disponível. Em seguida, o pacote NuGet atualizará o arquivo de configuração definindo o servidor de banco de dados padrão, que o Code First usa ao criar uma conexão por convenção. Caso o SQL Express esteja em execução, ele será usado. Caso o SQL Express não esteja disponível, o LocalDB será registrado como o padrão. Nenhuma alteração é feita no arquivo de configuração caso ele já contenha uma configuração para a conexão padrão de fábrica.
Usar o Code First com conexão por convenção e o nome determinado do banco de dados
Caso não tenha feito nenhuma outra configuração no aplicativo, chamar o construtor de cadeia de caracteres no DbContext com o nome do banco de dados que pretende usar, fará com que o DbContext seja executado no modo Code First com uma conexão de banco de dados criada por convenção ao banco de dados desse nome. Por exemplo:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingDatabase")
{
}
}
Neste exemplo, o DbContext usa "BloggingDatabase" como o nome do banco de dados e cria uma cadeia de conexão para esse banco de dados com o SQL Express (instalado com o Visual Studio 2010) ou o LocalDB (instalado com o Visual Studio 2012). Caso ambos estejam instalados, o SQL Express será usado.
Usar o Code First com a cadeia de conexão no arquivo app.config/web.config
Opte por colocar uma cadeia de conexão no arquivo app.config ou web.config. Por exemplo:
<configuration>
<connectionStrings>
<add name="BloggingCompactDatabase"
providerName="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Blogging.sdf"/>
</connectionStrings>
</configuration>
Essa é uma maneira fácil de dizer ao DbContext para usar um servidor de banco de dados diferente do SQL Express ou LocalDB, o exemplo acima especifica um banco de dados do SQL Server Compact Edition.
Caso o nome da cadeia de conexão corresponda ao nome do contexto (com ou sem qualificação de namespace), ele será encontrado pelo DbContext quando o construtor sem parâmetros for usado. Caso o nome da cadeia de conexão seja diferente do nome do seu contexto, poderá dizer ao DbContext para usar essa conexão no modo Code First passando o nome da cadeia de conexão ao construtor do DbContext. Por exemplo:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingCompactDatabase")
{
}
}
Como alternativa, use o formulário "nome=<nome da cadeia de conexão>" para a cadeia de caracteres passada ao construtor do DbContext. Por exemplo:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingCompactDatabase")
{
}
}
Esse formulário torna explícito que você espera que a cadeia de conexão seja encontrada no arquivo de configuração. Uma exceção será gerada caso uma cadeia de conexão com o nome fornecido não seja encontrada.
Banco de dados/Model First com cadeia de conexão no arquivo app.config/web.config
Os modelos criados com o Designer de EF são diferentes do Code First, pois seu modelo já existe e não é gerado a partir do código quando o aplicativo é executado. Normalmente, o modelo existe como um arquivo EDMX no projeto.
O designer adicionará uma cadeia de conexão EF ao arquivo app.config ou web.config. Essa cadeia de conexão é especial porque contém informações sobre como encontrar as informações no arquivo EDMX. Por exemplo:
<configuration>
<connectionStrings>
<add name="Northwind_Entities"
connectionString="metadata=res://*/Northwind.csdl|
res://*/Northwind.ssdl|
res://*/Northwind.msl;
provider=System.Data.SqlClient;
provider connection string=
"Data Source=.\sqlexpress;
Initial Catalog=Northwind;
Integrated Security=True;
MultipleActiveResultSets=True""
providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
O Designer de EF também gerará código que informa ao DbContext para usar essa conexão passando o nome da cadeia de conexão ao construtor do DbContext. Por exemplo:
public class NorthwindContext : DbContext
{
public NorthwindContext()
: base("name=Northwind_Entities")
{
}
}
O DbContext sabe carregar o modelo existente (em vez de usar o Code First para calculá-lo a partir do código) porque a cadeia de conexão é uma cadeia de conexão de EF que contém detalhes do modelo a ser usado.
Outras opções de construtor do DbContext
A classe de DbContext contém outros construtores e padrões de uso que permitem alguns cenários mais avançados. Alguns deles são:
- Use a classe de DbModelBuilder para criar um modelo Code First sem instanciar uma instância do DbContext. O resultado disso é um objeto do DbModel. Em seguida, passe esse objeto do DbModel para um dos construtores do DbContext quando estiver pronto para criar sua instância do DbContext.
- Passe uma cadeia de conexão completa ao DbContext em vez de apenas o nome do banco de dados ou da cadeia de conexão. Por padrão, essa cadeia de conexão é usada com o provedor System.Data.SqlClient, isso pode ser alterado ao definir uma implementação diferente de IConnectionFactory no contexto. Database.DefaultConnectionFactory.
- Use um objeto do DbConnection existente passando-o para um construtor do DbContext. Caso o objeto de conexão seja uma instância de EntityConnection, o modelo determinado na conexão será usado em vez de calcular um modelo usando o Code First. Caso o objeto seja uma instância de algum outro tipo, por exemplo, SqlConnection, o contexto o usará para o modo Code First.
- Passe um ObjectContext existente para um construtor do DbContext para criar um DbContext encapsulando o contexto existente. Isso pode ser usado para aplicativos existentes que usam ObjectContext, mas que desejam tirar proveito do DbContext em algumas partes do aplicativo.