Para establecer una conexión a base de datos usando Entity Framework Code First, se requieren varios pasos clave que cubren desde la instalación hasta la configuración avanzada del contexto de datos.
- Instalación de Antity Framework
Para agregar Entity Framework al proyecto, se utiliza el administrador de paquetes NuGet. Desde la consola del administrador de paquetes (Tools → Library Package Manager → Package Manager Console), se ejecuta el siguiente comando:
PM> Install-Package EntityFramework
- Configuración de la conexión
Tras la instalación, se añade automáticamente un archivo App.config con la sección de configuración de Entity Framework. A continuación, se muestra un ejemplo de cómo se define la conexión usando defaultConnectionFactory:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
</configuration>
Una configuración alternativa es usar la sección connectionStrings estándar de .NET:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="PortalContext" connectionString="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
- Definición del DbContext
Se crea una clase que hereda de DbContext, donde se configura el inicializador de la base de datos y se especifica la cadena de conexión definida en el archivo de configuración. A continuación, un ejemplo completo con opciones avanzadas:
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace Portal
{
public class PortalContext : DbContext
{
// Constructor estático para definir la política de inicialización de la base de datos
static PortalContext()
{
// Deshabilitar la inicialización automática para evitar la creación/modificación de la BD
Database.SetInitializer<PortalContext>(null);
}
public PortalContext()
: base("name=PortalContext")
{
// Desactivar la carga diferida (lazy loading)
this.Configuration.LazyLoadingEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Eliminar la convención de pluralización en nombres de tablas
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
// Deshabilitar la eliminación en cascada en relaciones uno a muchos
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// Deshabilitar la eliminación en cascada en relaciones muchos a muchos
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}
}
}
- Estrategias de inicialización de la base de datos
Entity Framework ofrece varios modos de inicialización que se definen mediante Database.SetInitializer. Las opciones más comunes son:
- CreateDatabaseIfNotExists: Crea la base de datos solo si no existe. Es el comportamiento predeterminado.
- DropCreateDatabaseIfModelChanges: Elimina y recrea la base de datos si el modelo ha cambiado.
- DropCreateDatabaseAlways: Elimina y recrea la base de datos en cada inicio, independientemente de los cambios.
Para evitar cualquier modificación no deseada en la base de datos, se puede desactivar completamente la inicialización:
Database.SetInitializer<PortalContext>(null);
- Configuraciones adicionales del DbContext
Dentro del constructor de PortalContext y en el método OnModelCreating, se pueden ajustar comportamientos importantes:
4.1 Desactivar la carga diferida
La carga diferida permite que las propiedades de navegación se carguen automáticamente al ser accedidas. Para desactivarla, se usa:
this.Configuration.LazyLoadingEnabled = false;
4.2 Deshabilitar la eliminación en cascada
Para evitar que Entity Framework aplique borrados en cascada en relaciones uno a muchos o muchos a muchos, se eliminan las convenciones correspondientes en OnModelCreating:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
4.3 Desactivar la pluralización automática de nombres de tablas
Por defecto, Entity Framework asigna nombres de tablas en plural a partir de los nombres de las clases. Para usar nombres exactos (singular), se elimina la convención:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
Estas configuraciones permiten un control más preciso sobre cómo Entity Framework interactúa con la base de datos, garantizando un comportamiento predecible y acorde a los requisitos del proyecto.