Mapeo de modelos usando atributos
Clase 9 de 25 • Curso de Fundamentos de Entity Framework
Contenido del curso
Cristian Pisco Intriago
Edgar Matias Candia Arguello
Miguel Angel Reyes Moreno
Alonso Gutiérrez Martínez
Jesús Salvador Castillo Javier
Jesús Marcano
Efrel Armando López Cáceres
Juan Sebastian Ramirez Leyva
Edgar Matias Candia Arguello
Cristian Pisco Intriago
ROMMEL DUAREZ SAENZ
rafael malanco velazquez
Pablo Andres Muñoz Martinez
Alan Samir Sierra Muñoz
Oscar Fuentes Esteves
Platzi Team
Victor Daniel Aguirre Gil
Jose Antonio Diaz Urbano
Javier Cómbita Téllez
Platzi Team
Jesús Daniel Pardo Serrato
Jairo Leonardo Olivera Sawka
Jhonatan Sandoval Velasco
Miguel Teheran
Cristhian Llanos
Vicente Estrada Domínguez
Oscar Fuentes Esteves
Juan Rossano
Miguel Teheran
Sebastián Sebastian NavarroC.
Norma Natalia Moreno Espinoza
Sebastián Silva Hernández
Kenet Andrés Chungandro Montenegro
Como dato adicional, si quieren especificar el nombre de la tabla en la base de datos tienen que usar la anotación "Table".
using System.ComponentModel.DataAnnotations.Schema; [Table("Task")] public class Tareas { ... }
buen aporte amigo
datazo
Para añadir el archivo gitignore solamente deben ingresar el siguiente comando: dotnet new gitignore
Gracias por el dato.
Maestro
Me encanta el ritmo de este curso, bien explicado todo.
Asi es, creo que Juan carlos tiene mucho conocimiento , pero no tiene la metodolgia para exponer una clase
Juan a mi me parece muy buena su metodologia, es rapido, correcto y conciso
En la definición de la llave foránea existen tres formas de definirla usando la anotación "ForeignKey".
public class Tarea { ... [ForeignKey("Categoria")] public Guid CategoriaId {get;set;} ... public virtual Categoria Categoria {get;set;} ... }
public class Tarea { ... public Guid CategoriaId {get;set;} [ForeignKey("CategoriaId")] public virtual Categoria Categoria {get;set;} ... }
public class Tarea { ... public Guid CategoriaId {get;set;} ... public virtual Categoria Categoria {get;set;} ... } public class Categoria { ... [ForeignKey("CategoriaId")] public virtual ICollection<Tarea> Tareas {get;set;} }
Por otro lado, desconozco la razón de utilizar la palabra reservada virtual; por lo general, el virtual se utiliza cuando hay herencia y quiero sobreescribir alguna propiedad, desde mi punto de vista utilizar virtual o no da lo mismo, espero que el profesor me pueda responder a esa inquietud
es para usar "carga lenta" se cargará esa data a memoria solo cuando se necesite
Excelente aporte muchas gracias
Cabe destacar que esta aproximación es Code first, también se puede implementar Data Base first y Model first. Dejo un link de stackoverflow con un poco de información.
https://stackoverflow.com/questions/5446316/code-first-vs-model-database-first
Para los que no les sugiere los imports/usings aun con extensiones instaladas, vayan a Settings, busquen "import" y checkeen esta opción:
Ya con eso los sugiere.
Goooood
Encontré esta documentación sobre DataAnnotations
Code First Data Annotations
Data Annotations Attributes in EF 6 and EF Core
Para quien quiera añadir el archivo .gitignore
dotnet new gitignore
Ese git ignore es genérico para todas las aplicaciones de .net o cambiara de acuerdo al tipo de aplicación que construyamos?
Mapeo de modelos usando atributos
El mapeo de modelos en Entity Framework se realiza para especificar cómo las propiedades de las entidades corresponden a las columnas de las tablas en la base de datos. Se pueden utilizar atributos para definir la configuración de mapeo.
Aquí hay un ejemplo de cómo se pueden mapear los modelos de entidad usando atributos en Entity Framework:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Category { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int CategoryId { get; set; } [Required] [MaxLength(50)] public string Name { get; set; } public ICollection<Homework> Homework { get; set; } } public class Homework { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int HomeworkId { get; set; } [Required] [MaxLength(50)] public string Name { get; set; } [Required] public int CategoryId { get; set; } [ForeignKey("CategoryId")] public Category Category { get; set; } }
Key para indicar la propiedad que es la clave primaria de cada entidad. También se utiliza el atributo DatabaseGenerated para especificar que el valor de la clave primaria se genera automáticamente por la base de datos.Required se utiliza para indicar que una propiedad es obligatoria y no puede ser nula. El atributo MaxLength se utiliza para especificar el número máximo de caracteres que se pueden almacenar en una propiedad.ForeignKey se utiliza para especificar la relación entre las entidades, en este caso, entre la entidad Category y la entidad Homework. Este atributo especifica que la propiedad CategoryId en la entidad Homework es una clave foránea que se refiere a la clave primaria de la entidad Category.Asi se puede definir un tipo de manera más especifica
El mapeo se realiza adicionando un
using System.ComponentModel.DataAnnotations;
Las palabras clave que usó el profe en esta clase:
Que pasa si tengo dos foreign keys con el mismo nombre (Id)? es decir, como le digo a cada foreign key cual es su tabla correspondiente cuando el nombre de la primary key de ambas tablas relacionadas es el mismo?
Dentro del modelo no puede haber 2 propiedas con el mismo nombre. debemos colocarle un nombre descriptivo para usarlo en C# y para la configuracion de la BD si se puede especificar el mismo nombre. Seria algo asi:
// Use the shadow property as a foreign key modelBuilder.Entity<Post>() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey("BlogForeignKey");
Hola gente, alguien sabe si hay un grupo de Discord o similar para hacer algún proyecto de este tipo ? Estaría bien reunirnos 🙏😀
No olvides usar el
using System.ComponentModel.DataAnnotations;
Parece que el .gitignore fue generado por: .
Es bastante extenso el .gitignore y parece estar generado por alguna utilidad ¿podrian indicar si hay alguna clase de otro curso que explique el contenido de ese archivo?
El problema con el gitignore de .NET es que cubre todos los tipos de proyectos incluyendo los de .NET Framework y de tamplates especiales, estos llevan demasiados archivos de utilidad que no se necesitan en el repo. La mejor forma de generarlo es usando el comando
dotnet new gitignore
Estoy haciendo el curso de Entity Framework y me dió un error al compilar, me apunta a un dato que yo veo igual al curso... por lo que no entiendo por que es, revisé cado uno de los terminos y todo pero no encuentro cual es el problema, cabe destacar que mi proyecto se llama projectef (project sin "o" al final).
Mi TareasContext.cs using Microsoft.EntityFrameworkCore; using projectef.Models; namespace projectef; public class TareasContext: DbContext { public DbSet <Categoria> Catogorias {get;set;} public DbSet <Tarea> Tareas {get;set;} public TareasContext(DbContextOptions<TareasContext> options) :base(options){ } }
C:\platzi\projectef\TareasContext.cs(3,29): error CS0246: El nombre del tipo o del espacio de nombres 'DbCon text' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\proje ctef.csproj] C:\platzi\projectef\Models\Categoria.cs(15,36): error CS0246: El nombre del tipo o del espacio de nombres 'T area' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\proje ctef.csproj] C:\platzi\projectef\TareasContext.cs(6,12): error CS0246: El nombre del tipo o del espacio de nombres 'DbSet <>' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\project ef.csproj] C:\platzi\projectef\TareasContext.cs(6,18): error CS0246: El nombre del tipo o del espacio de nombres 'Categ oria' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\proje ctef.csproj] C:\platzi\projectef\TareasContext.cs(8,12): error CS0246: El nombre del tipo o del espacio de nombres 'DbSet <>' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\project ef.csproj] C:\platzi\projectef\TareasContext.cs(8,18): error CS0246: El nombre del tipo o del espacio de nombres 'Tarea ' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\projectef\projectef .csproj] C:\platzi\projectef\TareasContext.cs(10,26): error CS0246: El nombre del tipo o del espacio de nombres 'DbCo ntextOptions<>' no se encontró (¿falta una directiva using o una referencia de ensamblado?) [C:\platzi\proje ctef\projectef.csproj] 0 Advertencia(s) 7 Errores
¡Hola! De acuerdo a la fracción del código que compartes. te iré colocando algunos puntos para que los revises por favor :)
namespace projectef retirar el ; y prueba colocandolo entre { ]using System.ComponentModel.DataAnnotations;using System.Collections.GenericSystem.Configuration.De igual forma acá hay otras posibles razones de que te mande el error CS0246
Para que se usa virtual en este caso?