Teoria Entity Framework Core

En el Program tenemos código que depende del nugget y la implementación de la base de datos que vamos a integrar.
Este usa una cadena del appsettings.json para conectar a la BBDD

"server=localhost;database=postgres;uid=postgres;password=thisisSomepassword"

Para crear una nueva entidad en la base de datos:

  • Creamos el Model pertinente (por ej.) Coche
  • Lo añadimos al ApplicationDbContext como un DbSet<Coche>
  • Añadimos una migration add-migration addedCoche
  • Ejecutamos update-database

Migration

Mecanismo para aplicar cambios en el modelo de datos de la aplicacion a la BBDD de manera incremental y versionable. Cada migracion contiene los pasos necesarios para llevar a cabo las modificaciones en la BBDD como agregar nuevas tablas, cambiar columnas existentes o eliminar indices.

Esto permite tener:

  • Despliegues consistentes: aplica mismos cambios en diferentes entornos.
  • Control de versiones
  • Evolucionar la BBDD

(lo siguiente es ideal para un entorno de desarrollo, pero NO para un entorno producivo. Para esto último visitar esto)

Cada vez que se hagan cambios a nivel de modelo y se quieran meter en la BBDD hay que hacer una migration y hacer el update.

ejecutar comando dentro de Package Manager Console. Crea la migración.

add-migration addCategoryToDatabase

Ejecuta los scripts y crea la BBDD si no existía.

update-database

Create entity with foreign key dependency

Tengo la clase Producto la cual quiero que tenga una dependencia con Categoria.

Definición de la clase relacionada Categoría.

public class Categoria
{
	[Key]
	public int Id { get; set; }

	[Required(ErrorMessage = "Nombre es obligatorio")]
	public string Nombre { get; set; }
}

Creamos la clase Producto la cual tiene la dependencia. Es importante que tenga el campo int CategoriaId y también que tenga una virtual Categoria donde se pueda cargar la propia categoria. El atributo virtual es importante porque lo sustituirá y rellenará el ORM al leer de la BBDD. Así mismo también es importante que sea nullable Categoria? para que al hacer el insert sea suficiente con CategoriaId y al leer de la BBDD Categoria estará rellenado.

public class Producto
{
	[Key]
	public int Id { get; set; }

	[Required(ErrorMessage = "Nombre es obligatorio")]
	public string Nombre { get; set; }

	[Required(ErrorMessage = "La descripcion es obligatoria")]
	public string Descripcion { get; set; }

	// Foreign Keys
	public int CategoriaId { get; set; }

	[ForeignKey("CategoriaId")]
	public virtual Categoria? categoria { get; set; }
}

Luego solo queda añadirlo en el DbContext

public DbSet<Producto> Producto { get; set; }

Y añadirlo a la base de datos

add-migration AddedProductoToDatabase
update-database

Luego, para cargarlos tenemos que usar .Include() asi

int Id = ...
IEnumerable<Producto> lista = _context.Producto
	.Include(categoria => categoria.categoria)
	.Include(tipo => tipo.tipoAplicacion)
	.FirstOrDefault(p => p.Id == Id);