CursosEmpresasBlogLiveConfPrecios

Creación de modelos

Clase 7 de 25 • Curso de Fundamentos de Entity Framework

Contenido del curso

Introducción

  • 1
    Bienvenida y presentación

    Bienvenida y presentación

    01:51 min
  • 2
    Prerrequisitos

    Prerrequisitos

    03:04 min
  • 3
    Conexión a base de datos

    Conexión a base de datos

    07:20 min
  • 4
    ¿Qué es un ORM en programación?

    ¿Qué es un ORM en programación?

    08:51 min
  • 5
    Introducción a Entity Framework

    Introducción a Entity Framework

    06:53 min
  • 6
    Creación de proyecto .NET con Entity Framework

    Creación de proyecto .NET con Entity Framework

    11:57 min

Iniciando con Entity Framework

  • 7
    Creación de modelos

    Creación de modelos

    Viendo ahora
  • 8
    Configuración de Entity Framework

    Configuración de Entity Framework

    06:53 min
  • 9
    Mapeo de modelos usando atributos

    Mapeo de modelos usando atributos

    09:52 min
  • 10
    Utilizando base de datos en memoria

    Utilizando base de datos en memoria

    10:13 min
  • 11
    Conectado a base de datos SQL server

    Conectado a base de datos SQL server

    10:53 min
  • 12
    Agregando conexión al archivo appsettings

    Agregando conexión al archivo appsettings

    07:28 min

Utilizando Fluent API

  • 13
    Introducción a Fluent API

    Introducción a Fluent API

    03:29 min
  • 14
    Creando modelo de categoría con Fluent API

    Creando modelo de categoría con Fluent API

    08:30 min
  • 15
    Creando modelo de tarea con Fluent API

    Creando modelo de tarea con Fluent API

    07:36 min
  • 16
    Conectado a base de datos con Fluent API

    Conectado a base de datos con Fluent API

    07:42 min

Migraciones

  • 17
    ¿Qué son las migraciones?

    ¿Qué son las migraciones?

    03:14 min
  • 18
    Inicializar las migraciones

    Inicializar las migraciones

    11:27 min
  • 19
    Creando una migración

    Creando una migración

    07:18 min
  • 20
    Agregando datos semilla

    Agregando datos semilla

    16:31 min

Consumo de datos

  • 21
    Obteniendo datos con Entity Framework

    Obteniendo datos con Entity Framework

    11:31 min
  • 22
    Guardando datos con Entity framework

    Guardando datos con Entity framework

    09:07 min
  • 23
    Actualizando datos con Entity framework

    Actualizando datos con Entity framework

    10:17 min
  • 24
    Eliminando datos con Entity framework

    Eliminando datos con Entity framework

    07:59 min

Cierre del curso

  • 25
    Continúa tu camino desarrollando

    Continúa tu camino desarrollando

    01:45 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      Comentarios

      Esteban Ricardo Sierra

      Esteban Ricardo Sierra

      student•
      hace 4 años
        Daniel Osvaldo Lopez García

        Daniel Osvaldo Lopez García

        student•
        hace 4 años
        Nelson Arturo Cortes Briceño

        Nelson Arturo Cortes Briceño

        student•
        hace 4 años
      Carlos Arturo Mendoza Mejía

      Carlos Arturo Mendoza Mejía

      student•
      hace 4 años
        KEYSY MARIEL HERNANDEZ MANJARRES

        KEYSY MARIEL HERNANDEZ MANJARRES

        student•
        hace 4 años
        Steven Rendon

        Steven Rendon

        student•
        hace 3 años
      Kevin Castellano

      Kevin Castellano

      student•
      hace 4 años
        Daniel David Mejia Vargas

        Daniel David Mejia Vargas

        student•
        hace 4 años
        Facundo Oubel

        Facundo Oubel

        student•
        hace 4 años
      Kevin Castellano

      Kevin Castellano

      student•
      hace 4 años
        Carlos Arturo Mendoza Mejía

        Carlos Arturo Mendoza Mejía

        student•
        hace 4 años
        Jonathan Cumini

        Jonathan Cumini

        student•
        hace 3 años
      Hans González

      Hans González

      student•
      hace 3 años
        Jonathan Cumini

        Jonathan Cumini

        student•
        hace 3 años
      Platzi Team

      Platzi Team

      student•
      hace 3 años
      Luis Enrique Carreño Herreño

      Luis Enrique Carreño Herreño

      student•
      hace 4 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 4 años
      juan lopes

      juan lopes

      student•
      hace 3 años
        Jonathan Cumini

        Jonathan Cumini

        student•
        hace 3 años
      Juan Heredia

      Juan Heredia

      student•
      hace 4 años
        Carlos Arturo Mendoza Mejía

        Carlos Arturo Mendoza Mejía

        student•
        hace 4 años
      Felipe de Jesús Isidro

      Felipe de Jesús Isidro

      student•
      hace 4 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 4 años
      Yaoska Margarita Telleria López

      Yaoska Margarita Telleria López

      student•
      hace 3 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 3 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 3 años
      Juan Betancur

      Juan Betancur

      student•
      hace 4 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 4 años
      Juan Carlos Gelpud Rosero

      Juan Carlos Gelpud Rosero

      student•
      hace 4 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 4 años
      Esteban Cerda Román

      Esteban Cerda Román

      student•
      hace 2 años
      César David García Narro

      César David García Narro

      student•
      hace 3 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 3 años
      David Orlando Gomez Alarcon

      David Orlando Gomez Alarcon

      student•
      hace 4 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 4 años
      Kevin Eduardo Vásquez Oliva

      Kevin Eduardo Vásquez Oliva

      student•
      hace 3 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 3 años
      Leidy Ruiz

      Leidy Ruiz

      student•
      hace 3 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 3 años
      Mauricio Zárate

      Mauricio Zárate

      student•
      hace un año
        Carlos Enrique Ruiz Medina

        Carlos Enrique Ruiz Medina

        student•
        hace 5 meses
      sergio Castro cano

      sergio Castro cano

      student•
      hace 2 años
        Miguel Teheran

        Miguel Teheran

        teacher•
        hace 2 años

      El tipo de dato Guid es un 'Identificador global único' el cual nos retorna un dato unico, ejemplo : 5a7939fd-59de-44bd-a092-f5d8434584de

      muchísimas gracias, por el aporte.

      tenia esa duda, gracias bro

      Para los que no les gusta escribir todo el código desde cero pueden añadir esta extencion a su VSC: C# y C# Extensions asi no van a tener que escribir el namespace y la clase, ya las extensiones lo hacen por uno, van a ir al panel izquiedo en donde estan unos cuadrados dice extenciones y luego en añadir o pueden descargarlas.

      Aqui les dejo los links:

      • https://marketplace.visualstudio.com/items?itemName=jchannon.csharpextensions

      • https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp

      yo tengo ambas extensiones y aun así me toca escribirlos, no se porque no me sale por defecto.

      Hola , Intenta usar esta.

      https://marketplace.visualstudio.com/items?itemName=kreativ-software.csharpextensions.

      La que comparte el compañero ya està en desuso, por lo tanto, no tiene mantenibilidad y puede generar probemas de compatibilidad.

      Si tienen el problema que sin importar el nombre de alguna de las clases creadas les arroja el error de que ya existe pueden ejecutar el comando "Restart OmniSharp".

      Presionen Ctrl + Shift + P y en el cuadro de texto que se abre escriben "Restart OmniSharp" sin comillas y presionan Enter

      Sabes porque sucede esto? Me funciono pero si me gustaría saber el porque.

      Tambien me interesaria saber por que sucede esto

      La palabra clave virtual se utiliza para modificar un método, propiedad, indizador o declaración de evento y permite invalidar cualquiera de estos elementos en una clase derivada.

      Fuente:

      Fuente de la fuente:

      Kevin Castellano, están caídos los enlaces.

      Los links no funcionan si les haces clic, pero puedes usar la URL sin problemas.

      Para no estar escribiendo el public x x x , pueden escribir prop y automáticamente les generara el detalle del objeto con get y set, y solo es de cambiarle de que tipo y nombre :)

      Excelente! Y propfull se usa para explicitar los métodos get y set (no para esta clase)

      Creacion de Modelos


      Lo primero que debemos hacer para crear nuestros modelos es crear una carpeta Models donde guardaremos nuestras clases para cada tabla:

      En nuestro archivo Categoria.cs, creamos nuestro modelos con los atributos de igual manera en nuestro archivo Tara.cs

      public class Categoria { public int Id { get; set; } public string Nombre { get; set; } public virtual ICollection<Tarea> Tareas { get; set; } } public class Tarea { public int Id { get; set; } public string Nombre { get; set; } public int CategoriaId { get; set; } public virtual Categoria Categoria { get; set; } }

      **Guid**es un acrónimo que significa "Globally Unique Identifier", es decir, un Identificador Único Global en inglés. Es un tipo de datos que se utiliza para identificar de forma única y segura elementos, ya sea en una aplicación o en un sistema.

      Los **Guid**se componen de 16 bytes que se combinan para formar un número único, y están diseñados para ser globales, es decir, que no se repitan en ninguna parte del mundo. Esto los hace muy útiles para identificar elementos únicos en un sistema distribuido, como por ejemplo, registros en una base de datos.

      En el ejemplo anterior, se utiliza un **Guid**para identificar cada categoría y tarea, garantizando que cada una tenga un identificador único y no haya conflicto entre ellas.

      Expandiendo los conocimientos:

      • **Get**y Set son propiedades de acceso que permiten obtener y establecer valores para una propiedad determinada. En otras palabras, Get permite leer el valor de una propiedad y Set permite asignarle un nuevo valor. En el ejemplo de las clases Categoria y Tarea , se utiliza una combinación de Get y Set para definir las propiedades Id, Nombre, CategoriaId y Categoria.
      • Virtual es un modificador de acceso que permite a una propiedad ser sobreescrita en clases heredadas. En el ejemplo, la propiedad Categoria de la clase Tarea se marca como virtual para permitir que se sobreescriba en una clase heredada.
      • ICollection<T> es una interfaz genérica que representa una colección de objetos que se pueden recorrer y modificar. En este caso, ICollection<Tarea> se utiliza para definir la propiedad Tareas en la clase Categoria, que representa una colección de tareas asociadas a una categoría.

      Que ventajas existen al usar como tipo de dato GUID para el identificador de una entidad? Que ventajas tienen respecto al uso de identities en SQL Server y sequences en PostgreSQL?

      Excelente pregunta! GUID es unico en todo el entorno de la base de datos, usando un numerico autoincrementado vas a tener varios repetidos en cada tabla y esto imposbilita el buscar un registro de manera global. En las bases de datos NoSQL es casi mandatorio usar GUID por el tema de no manejar relaciones

      En el contexto de EF, marcar una propiedad como virtual permite a EF usar la carga diferida para cargarla. Para que la carga diferida funcione, EF tiene que crear un objeto proxy que invalide las propiedades virtuales con una implementación que cargue la entidad a la que se hace referencia cuando se accede a ella por primera vez. Si no marca la propiedad como virtual, la carga diferida no funcionará con ella.

      Gracias Juan! Podrías añadir un link donde se explique en mayor detalle? Soy de los que les gusta entender cada keyword :)

      Por si tienen problemas y nos les funciona el Hello Word dentro de su IDE, les dejo las siguientes notas

      Si ejecutamos nuestro proyecto y este no funciona, aparece el mensaje de using a preview package for this significa que estamos intentando compilar una versión que no es compatible y por lo tanto marcara errores, para solucionar esto debemos identificar la versión de net con la que estamos trabajando para eso usamos el comando dotnet –version Esto nos indicara la versión en la que estamos, algunas versiones solo son compatibles con el IDE más reciente con el que trabajamos, por ejemplo, la versión 6.0 no es compatible con Visual Studio 2019, por lo que no podremos indicarle que se trata de esta versión y no entenderá algunos comandos que le estamos enviando. Para abrir la pestaña de propiedades de un proyecto damos clic derecho sobre el y seleccionamos la versión de .NET

      También podría funcionar si permitimos funciones preview en nuestro IDE, para ello nos dirigimos a las opciones de visual Studio (en la pestaña de Tools) y buscamos preview

      Ahi te falto un signo de "-" amigo, el comando es este:

      dotnet --version

      Me gusto tu aporte :)

      Por que los atributos de relación los coloca como virtual?

      Para que la logica del atributo se pueda sobreescribir. de estamera intermente entity fraemwork hace la implementación y al momento de usarlo devuelve los datos relacionados

      ¿Por qué una de las propiedades es de ICollection y la otra no?, alguien tan amable que me explique

      ICollection se necesita en EF cuando queremos hacer referencia sobre una collecion que se va cargar de manera virtual y que debe soportar todas las operaciones de una tabla es decir list, add, edit, delete

      ICollection se necesita en EF cuando queremos hacer referencia sobre una colección que se va cargar de manera virtual y que debe soportar todas las operaciones de una tabla es decir list, add, edit, delete

      Lo que haces con public virtual es hacer las relación de las llaves foráneas?

      Para poder extraer información de la relación

      Para que sirve el virtual? Lo he visto en muchas ocasiones pero no entiendo si el uso de este es para optimizar el uso en memoria.

      Básicamente indica que puede una propiedad o método puede ser sobrescrito por cualquier clase que herede de el usando el override. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/virtual

      Guid:

      es un acrónimo. Significa "Globally Unique Identifier" = Identificador Único Global. Es un tipo de datos que se utiliza para identificar de forma única y segura elementos, ya sea en una aplicación o en un sistema.

      Los Guid se componen de 16 bytes que se combinan para formar un número único, y están diseñados para ser globales, o sea, que no se repitan en ninguna parte del mundo. Esto los hace muy útiles para identificar elementos únicos en un sistema distribuido, como por ejemplo, registros en una BD.

      Tengo problemas para llevar el curso, puesto estoy siguiendo la ruta Backend pero no es la primera vez que siguiendo la ruta me toco con un curso que me pide otros cursos. Mi duda es, para este curso realmente cuanto necesito saber de C# ya que menciono que existe un curso de C# que tomar, y es el primero en la ruta de Backend C# y .NET pero en ningún momento del curso vemos, propiedades o clases.

      Hola Cesar, nos hace falta un curso en ese paso de POO con C# para poder enteder esa parte. Lamento mucho tu confusion. Hay curso que te peude servir simplemente que esta muy desactualizado pero en conceptos generales te puede ayudar: https://platzi.com/cursos/fundamentos-csharp-2/

      No entendi el GUID y el Virtual, me lo prodrian explicar mejor

      GUID es un identificador único en el contexto de la base de datos. Es super chevere por que te garantiza tener un identificador que no es autoincrementado y que no repite dentro de todo el contexto de la BD. muchas bases de datos vienen optimizadas para este tipo, mas información en:

      virtual es una palabra clave reservada de C# que permite indicar que un método o que una propiedad se puede sobreescribir. Usamos esta propiedad en EF para que al momento de llenar la información poder enlazar la propiedad con la referencia de la base de datos.

      ¿El nombre del namespace puede ser cualquier nombre o debe estar relacionado al nombre de la carpeta que contiene el proyecto?

      Generalmente se utiliza el nombre del proyecto y se va extendiendo por carpeta por ejemplo: MyProject MyProject.Models MyProject.Data

      si las tablas tienen una relación como se puede especificar al modelo la relación que existe entre una clase y otra para que la tabla tenga la misma relación?

      En las clases de mas adelante vamos aprender paso a paso esta parte de las relaciones para mas info acá: https://www.entityframeworktutorial.net/efcore/configure-one-to-many-relationship-using-fluent-api-in-ef-core.aspx

      Me llama la atención que las propiedades de las clases se las declare de tipo public pero que se les agreguen getters y setters.

      ¿No sería mejor declararlas como private u omitir el uso de los getter y los setter?

      Encapsulamiento con flexibilidad: Las propiedades como public string Titulo { get; set; } son una forma abreviada de declarar campos privados con acceso controlado. Aunque son públicas, permiten agregar lógica interna más adelante sin cambiar la interfaz pública.

      public string Titulo { get => _titulo; set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException("El título no puede estar vacío"); _titulo = value; } }

      Las propiedades privadas solo se usan dentro de la clase, lo que limita su utilidad si necesitas exponer datos a otras partes del sistema.

      Fuente: Copilot

      Porque en Categoria se declara la propiedad virtual como ICollection?

      Para que pueda sobreeescribirse por EF y cambiar el comportamiento