👽
3ntr0 Apuntes
  • 📚Principios SOLID y Clean Code
    • 💲Deuda Técnica
    • 📌Mejorar Nombres
      • 📄Nombre según Tipo
      • 🚗Nombre Clases
      • ⚙️Nombres Funciones
    • ☑️Mejorar Funciones
    • ➿Principio DRY
    • 🧼Clean Code en Clases (POO)
      • 📘 Principio de Responsabilidad Única (SRP)
    • 🤮🇸 🇹 🇺 🇵 🇮 🇩 - Code Smells
      • 🚫Singleton
      • 🙏Tight Coupling
      • 🥸U P I D
      • 🚩Más Code Smells
  • 💕Angular
    • 🏍️Standalone
    • 🆚ngClass vs [class.clase]
    • 🩻Directivas
    • 🚩ElementRef
    • 🎀Decoradores
      • @HostListener
    • 🔄OnChanges
    • 🧪Testing - Jasmine y Karma
      • 🚀Módulo 1: Introducción a las pruebas unitarias
      • 🧫Módulo 2: Introducción a Jasmine
      • ⚒️Módulo 3: Introducción a Karma
      • 🔬Módulo 4: Pruebas unitarias en Angular
        • Código comentado Paso a Paso
      • 🕵️‍♂️Módulo 5: Técnicas avanzadas en Jasmine
      • 📚Módulo 6: Técnicas avanzadas en Karma
  • 🖼️HTML y CSS
    • 🖌️Custom Properties
    • Trucos
    • Brakepoints
  • 🧋Javascript
    • 🛠️Funciones
    • 📦Arrays
      • Every y Some
      • Map
      • Reduce
    • 😎Hoisting
    • 🪚Desestructuración
    • 🛻Programación Asincrona
      • 📞Callbacks
      • 🌟Promises
      • 🆚Promise.all Y Promise.any
      • 🚀Async/Await
    • Respuestas HTTP
    • 🧐Dudas Básicas
      • NodeList
      • 🧐Contextos de .this
      • 💭Parametro Rest
      • 🗨️arguments
      • 🙀JavaScript no tiene clases
      • 🆚Null vs Undefined
      • 🔎Operador in
      • 🟨Operador Spread
      • ❓Encadenamiento Opcional
      • 🔲Notación de Corchetes
      • ⛓️Coalescencia Nula (??)
      • 🆚Shallow Copy vs Deep Copy
      • 🆚.json VS JSON.parse
      • ⚙️Fetch wrapper
      • Sets
      • Maps
  • 📒Terminología
    • 💎Esenciales
    • Web
    • Javascript
  • 🌐GIT
    • Source Tree
  • 🧬React
    • 🫂Babel
  • 🔧 Fundamentos de C#
    • 🎛️General
      • 🧐Diferencia Equals y ==
      • 🧐Diferencia entre typeof y .GetType()
      • 📐Convenciones de Nomenclatura
    • 💠Summary
    • 📇.resx
    • 📄Strings
      • ⛓️Comparación de cadenas
    • 🧲Regex
    • 📦POO
      • 🚙Clases
        • ✏️Clase String
        • 📥Métodos de Acceso
        • ⚗️Métodos de Extensión
    • 🖇️Pattern Matching
    • 🚩Excepciones
    • Programación Asíncrona
    • 🔎LINQ
      • 🅿️PLINQ
  • 🌐 Desarrollo Web con ASP.NET
    • 🧬Modelos
      • 🗒️Data Annotations
        • 📑Lista
        • 🧪Atributos
          • 🛠️Atributos Personalizados
          • 🧰AttributeUsage
          • 📥Acceso a los atributos
        • 📚Documentación
    • 👷Servicios
      • ⭐Servicios Singleton
    • ⏳Sesiones
      • 🧭Temp Data
    • DbContext
      • 🔄Eager Loading
    • 🥽Manejo de Datos
      • 🗃️Archivos
        • 📤Subida de Archivos
        • ✏️Leer y Escribir
        • 🕓Manejo de Archivos Temporales
        • 🛡️Validación de Archivos en ASP.NET Core
      • Colecciones
        • 🪜Pila (Stack)
        • 🏇Cola (Queue)
      • 🩻Manejo de XMLs
        • 📂XmlDocument
          • 🎯XPath
        • 🧿XmlReader
    • ❤️Tips y Utilities
      • 🟰StringComparison
    • 🧰Debug Tools
      • 🧭Stopwatch
  • 🚀Razor
    • 🧱Configuración de Proyecto
    • 📃Pages
      • 🔸Método OnGet
      • 🔸Carpeta Models
      • 🔸Partial Pages
    • 🎨Layouts
      • Aplicar CSS A UNA PAGE
    • 🚴‍♂️Routing
    • 🏢_ViewImports
    • ✒️Sintaxis Razor
      • 😀Introducción
      • 📔Expresiones Implícitas
      • 📕Expresiones Explícitas
      • ✍️Renderizar Texto
      • 🧑‍🔬Class Page Model
      • 🔖Tag Helpers
        • 🔹asp-page
        • 🔹asp-append-version
        • 🔹asp-for
        • 🔹asp-items
        • 🔹asp-action y asp-controller
  • 🔮LUA
    • 🎯Fundamentos
    • ⌨️Entrada por Consola
    • 🔗Estructuras de Control
    • ⚒️Funciones
    • 📦Tablas
    • 📚Funciones y Librerías Estándar
    • 🦖POO
Con tecnología de GitBook
En esta página
  • Creación de Modelos
  • Anotaciones
  • Definición de Relaciones
  1. 🌐 Desarrollo Web con ASP.NET

Modelos

AnteriorPLINQSiguienteData Annotations

Última actualización hace 1 año

Creación de Modelos

Definir Clases de Modelo: Cada modelo es una clase en C#. Estas clases representan entidades en tu base de datos. Cada propiedad de la clase se mapeará a una columna en la tabla de la base de datos.

public class Estudiante
{
    public int EstudianteId { get; set; }
    public string Nombre { get; set; }
    // Otras propiedades
}

Anotaciones

Puedes utilizar o Fluent API para configurar aspectos del modelo, como restricciones, nombres de tablas, etc. Fluent API ofrece más opciones y es más flexible, pero Data Annotations es más directo y fácil de leer.

using System.ComponentModel.DataAnnotations;

public class Estudiante
{
    [Key]
    public int EstudianteId { get; set; }

    [Required]
    [StringLength(100)]
    public string Nombre { get; set; }
    // Otras propiedades
}

Definición de Relaciones

En Entity Framework, las relaciones entre entidades (o tablas) se representan mediante propiedades de navegación y claves foráneas. Estas relaciones se pueden categorizar principalmente en tres tipos: Uno-a-Uno, Uno-a-Muchos, y Muchos-a-Muchos.

Importante saber que una propiedad de navegación es una propiedad en una clase de entidad que hace referencia a otra entidad o entidades, permitiendo así acceder a las relaciones de una forma orientada a objetos. Las propiedades de navegación son claves para trabajar con relaciones entre entidades, ya que facilitan la manipulación y consulta de datos relacionados en una aplicación.

A diferencia de las propiedades normales de una entidad que se mapean a una columna en una tabla de base de datos, las propiedades de navegación se utilizan para representar las relaciones y no tienen una representación directa en la tabla.

🔹Relación Uno-a-Uno

En una relación Uno-a-Uno, una entidad está asociada directamente con otra entidad.

public class Usuario
{
    [Key]
    public int UsuarioId { get; set; }

    [Required, StringLength(100)]
    public string Nombre { get; set; }

    // Propiedad de navegación
    public virtual Perfil Perfil { get; set; }
}

public class Perfil
{
    [Key, ForeignKey("Usuario")]
    public int PerfilId { get; set; }

    [Required, StringLength(200)]
    public string Bio { get; set; }

    // Propiedad de navegación
    public virtual Usuario Usuario { get; set; }
}
  • Cada Usuario tiene un único Perfil.

  • PerfilId y UsuarioId suelen ser el mismo valor para indicar esta relación uno-a-uno.

  • Usuario tiene una propiedad de navegación Perfil, y Perfil tiene una propiedad de navegación Usuario.

🔹 Relación Uno-a-Muchos

En una relación Uno-a-Muchos, una entidad puede estar asociada con varias entidades de otro tipo.

public class Profesor
{
    [Key]
    public int ProfesorId { get; set; }

    [Required, StringLength(100)]
    public string Nombre { get; set; }

    // Propiedad de navegación
    public virtual ICollection<Curso> Cursos { get; set; }
}

public class Curso
{
    [Key]
    public int CursoId { get; set; }

    [Required, StringLength(100)]
    public string Titulo { get; set; }

    [ForeignKey("Profesor")]
    public int ProfesorId { get; set; }

    // Propiedad de navegación
    public virtual Profesor Profesor { get; set; }
}
  • Un Profesor puede impartir varios Cursos.

  • Curso tiene una propiedad ProfesorId que es una clave foránea apuntando a Profesor.

  • Profesor tiene una colección de Cursos, mostrando la relación de uno a muchos.

3. Relación Muchos-a-Muchos

En una relación Muchos-a-Muchos, varias entidades de un tipo pueden estar asociadas con varias entidades de otro tipo.

public class Estudiante
{
    [Key]
    public int EstudianteId { get; set; }

    [Required, StringLength(100)]
    public string Nombre { get; set; }

    // Propiedad de navegación
    public virtual ICollection<EstudianteCurso> EstudianteCursos { get; set; }
}

public class Curso
{
    [Key]
    public int CursoId { get; set; }

    [Required, StringLength(100)]
    public string Nombre { get; set; }

    // Propiedad de navegación
    public virtual ICollection<EstudianteCurso> EstudianteCursos { get; set; }
}

public class EstudianteCurso // Tabla de unión
{
    [Key, Column(Order = 0), ForeignKey("Estudiante")]
    public int EstudianteId { get; set; }

    [Key, Column(Order = 1), ForeignKey("Curso")]
    public int CursoId { get; set; }

    public virtual Estudiante Estudiante { get; set; }
    public virtual Curso Curso { get; set; }
}
  • Un Estudiante puede inscribirse en varios Cursos y un Curso puede tener varios Estudiantes.

  • La tabla de unión EstudianteCurso contiene claves foráneas de ambas tablas (EstudianteId y CursoId) y sirve para representar esta relación.

🧬
Data Annotations