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 unDbSet<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);