Conocer las bases de .NET core

1

Desarrollo de Aplicaciones Web con Blazor y Entity Framework

2

Evolución de las tecnologías .NET

3

Evolución y Uso de Visual Studio Code en Desarrollo .NET

4

Desarrollo Web: Cliente, Servidor y Optimización con JavaScript

5

Instalación de Visual Studio Community paso a paso

6

Instalación y Configuración de SQL Server Express 2019

Entender la estructura de Blazor

7

Desarrollo de Aplicaciones con Blazor Server y WebAssembly

8

Estructura y Configuración de Aplicaciones en Visual Studio Code

9

Creación de Formularios Dinámicos con Blade y C#

10

Creación y Uso de Componentes en Glaceau para Formularios Reutilizables

11

Creación y Gestión de Formularios HTML Básicos

12

Arquitectura y Patrones de Diseño en Desarrollo de Software

Aplicar Entity Framework

13

Arquitectura por Capas y Patrones de Diseño en Software

14

Modelado de Datos para Aplicación de Inventario

15

Modelo de Datos para Gestión de Inventarios

16

"Creación de Entidades en .NET Core para Bases de Datos"

17

Diseño y Configuración de Entidades en Bases de Datos

18

Construcción de Relaciones en Modelos de Datos con Entity Framework

19

Creación de Capas de Acceso a Datos con Entity Framework

20

Configuración y migración de bases de datos con Entity Framework

21

Precarga de Datos en Bases de Datos con Entity Framework

Integrar datos en ambientes Blazor

22

Creación de Capas de Negocio en Aplicaciones .NET

23

CRUD Básico en Bases de Datos Relacionales

24

"Creación de Formularios para Registro de Productos en Inventario"

25

"Creación de Formularios y Menús Desplegables en Páginas Web"

26

Listar y Mostrar Productos en Tabla HTML con C#

27

Filtrado Dinámico de Productos por Categoría en HTML

28

Creación y Navegación de Páginas con Listados y Formularios en Sitios Web

29

Actualización de Información de Productos en Componentes Web

30

Actualización y Gestión de Formularios en Aplicaciones Web

31

Integración de Productos en Bodegas: Formularios y Almacenamiento

32

Asociación de Productos con Bodegas en Sitios Web

33

Gestión de Entradas y Salidas en Almacenamiento de Bodegas

34

Cargar y asociar productos a bodegas en Entity Framework

35

Gestión de Inventarios: Actualización y Control de Stocks

Aplicar Diseño con Bootstrap

36

Diseño Responsivo con Vustra: Mejora la Experiencia del Usuario

37

Publicación de Sitios Web en Azure Paso a Paso

38

Arquitectura y Herramientas para Desarrollo Web

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Construcción de Relaciones en Modelos de Datos con Entity Framework

18/38
Recursos

¿Cómo estructurar correctamente las relaciones entre entidades?

La estructura de las relaciones entre entidades es crucial para gestionar eficazmente la base de datos. En el desarrollo de software, comprender cómo las entidades interactúan es fundamental. Al crear y manejar estas relaciones, conseguimos un sistema organizado y eficiente que puede adaptarse a las necesidades cambiantes de la aplicación. Este proceso se realiza comúnmente con las bases de datos relacionales, pero también es aplicable a bases de datos no relacionales, como las utilizadas con Entity Framework, un ORM popular para .NET.

¿Qué es Entity Framework y cómo se establecen las relaciones?

Entity Framework es un ORM (Object-Relational Mapper) que facilita el trabajo con bases de datos al permitir gestionar datos como objetos. Para establecer relaciones entre entidades, usualmente se utiliza una "colección pública" de un tipo específico de clase, que forman asociaciones entre tablas que se representan como clases.

Por ejemplo, consideremos la relación entre categorías y productos. En una clase de categorías, podemos definir una colección de productos para demostrar que una categoría puede contener varios productos:

public ICollection<Product> Products { get; set; }

Por otra parte, en la clase de productos, se define un atributo para señalar la categoría a la que pertenece:

public string CategoryId { get; set; }
public Category Category { get; set; }

¿Cómo reflejar las relaciones de uno a muchos?

La mayoría de las relaciones en bases de datos relacionales son de tipo "uno a muchos". Esto significa que una entidad puede estar relacionada con múltiples entidades de otro tipo. En el ejemplo anterior, se asume que una categoría puede incluir varios productos, pero cada producto solo tiene una categoría.

Para definir esta relación, utilizamos las colecciones en una clase para las múltiples entidades, y una referencia única para las asociaciones que son de "muchos a uno". Esta distribución se puede aplicar también para establecer relaciones entre productos y bodega, o productos y almacenamiento.

¿Cómo implementar colecciones con Entity Framework?

Implementar colecciones con Entity Framework nos permite agrupar y manipular conjuntos de datos de manera efectiva. Para definir una colección, se emplea el siguiente código en la clase correspondiente:

public ICollection<Product> Products { get; set; }

Esto indica que podemos almacenar múltiples productos dentro de una categoría. Además, utilizamos métodos "set" y "get" para permitir la asignación y recuperación de datos:

public class Category
{
    public string CategoryId { get; set; }
    public ICollection<Product> Products { get; set; }
    
    // Otros atributos relevantes
}

Estas prácticas nos permiten gestionar colecciones de manera eficiente y efectiva. Es clave asegurarse de que estas relaciones reflejan adecuadamente el modelo de datos que se está manejando.

¿Qué retos enfrentar al crear relaciones entre entidades?

Establecer relaciones puede ser complejo, pues se requiere conocer bien el modelo de datos y cómo las entidades deben desempeñarse entre sí. Las entidades deben reflejar adecuadamente la estructura de los datos subyacentes y mantener integridades referenciales.

Tus próximos pasos pueden incluir implementar las relaciones entre otras entidades faltantes y, eventualmente, conectar todas estas entidades a la base de datos para activar el modelo completamente estructurado. Implementar un modelo de datos bien estructurado es clave para garantizar la integridad y funcionalidad de la aplicación.

La práctica y la atención al detalle son esenciales para dominar el manejo de relaciones entre entidades en frameworks como Entity Framework. ¡Sigue adelante y mantente enfocado en desarrollar habilidades robustas en la administración de bases de datos!

Aportes 11

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Les comparto unos pequeños apuntes. 😁

Para este caso la entidad Products (N) y Category (1) tiene una relación N:1, lo cual quiere decir lo siguiente: Una categoría puede estar relacionada con muchos productos.

Para realizar esta asociación en código tenemos que entender lo siguiente: La entidad que tiene la cardinalidad 1 cuanta con un conjunto datos, en este caso de la entidad “ProductEntity”.

public ICollection <ProductEntity> Products { get; set; }

(Nos encontramos en la entidad CategoryEntity).

La entidad con la cardinalidad N (muchos) tiene que hacer referencia al id de la tabla con la cual se relaciona e indicar el nombre de esa tabla, hay que recordar que al pasar un modelo entidad relación a relacional en una relación N:1 la llave foránea se coloca en la entidad con cardinalidad N.

public string CategoryId { get; set; }

public CategoryEntity Category { get; set; }

(Nos encontramos en la entidad ProductsEntity).

Espero que sea de ayuda.
Saludos 👋.

No estoy muy seguro seguro sí usé el razonamiento correcto al crear las relaciones, así quedó:

    public class InOutEntity
    {
        [Key]
        [StringLength(50)]
        public string InOutId { get; set; }
        [Required]
        public DateTime InOutDate { get; set; }
        [Required]
        public int Quantity { get; set; }
        [Required]
        public bool IsInput { get; set; }
        public string StorageId { get; set; }
        public StorageEntity Storage { get; set; }
    }

    public class WherehouseEntity
    {
        [Key]
        [StringLength(50)]
        public string WherehouseId { get; set; }
        [Required]
        [StringLength(100)]
        public string WherehouseName { get; set; }
        [Required]
        [StringLength(100)]
        public string WherehouseAddress { get; set; }
        public string StorageId { get; set; }
        public StorageEntity Storage { get; set; }
    }

    public class StorageEntity
    {
        [Key]
        [StringLength(50)]
        public string StorageId { get; set; }
        [Required]
        public DateTime LastUpdate { get; set; }
        [Required]
        public int PartialQuantity { get; set; }
        public string ProductId { get; set; }
        public ProductEntity Product { get; set; }
        public ICollection<WherehouseEntity> Wherehouses { get; set; }
        public ICollection<InOutEntity> InOuts { get; set; }
    }

Reto:

    public class ProductEntity
    {
        [Key]
        public int ProductId { get; set; }

        [Required]
        [StringLength(50)]
        public string ProductCode { get; set; }

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

        [StringLength(600)]
        public string ProductDescription { get; set; }

        [Required]
        public decimal ProductTotalQuantity { get; set; }
        
        [Required]
        public int CategoryId { get; set; }

        public CategoryEntity Category { get; set; }

        public ICollection<StorageEntity> Storages { get; set; }
    }

    public class StorageEntity
    {
        [Key]
        public int StorageId { get; set; }

        [Required]
        [StringLength(50)]
        public string StorageCode { get; set; }

        [Required]
        public DateTime StorageLastUpdate { get; set; }

        [Required]
        public decimal StoragePartialQuantity { get; set; }

        [Required]
        public int ProductId { get; set; }

        public ProductEntity Product { get; set; }

        [Required]
        public int WarehouseId { get; set; }

        public WarehouseEntity Warehouse { get; set; }

        public ICollection<InOutEntity> InOutEntities { get; set; }
    }

    public class WarehouseEntity
    {
        [Key]
        public int WarehouseId { get; set; }

        [Required]
        [StringLength(50)]
        public string WarehouseCode { get; set; }

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

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

        public ICollection<StorageEntity> Storages { get; set; }
    }

    public class InOutEntity
    {
        [Key]
        public int InOutId { get; set; }

        [Required]
        [StringLength(50)]
        public string InOutCode { get; set; }

        [Required]
        public DateTime InOutDate { get; set; }

        [Required]
        public decimal InOutQuantity { get; set; }

        [Required]
        public bool InOutIsInput { get; set; }

        [Required]
        public int StorageId { get; set; }

        public StorageEntity Storage { get; set; }
    }

Reto
![](
![](
![](

Hice un diagrama para poder ver como funcionan los productos y las categorias

Genial

Creo haber utilizado la lógica correcta. Espero que si alguien sabe del tema por favor me corrija.
CategoryEntity

public class CategoryEntity
    {
        [Key]
        [StringLength(50)]
        public string CategoryId { get; set; }

        [Required]
        [StringLength(100)]
        public string CategoryName { get; set; }
        public ICollection<ProductEntity> Products { get; set; }
    }

ProductEntity

public class ProductEntity
    {
        [Key]
        [StringLength(10)]
        public string ProductId { get; set; }
        [Required]
        [StringLength(100)]
        public string ProductName { get; set; }

        [StringLength(600)]
        public string ProductDescription { get; set; }

        public int TotalQuantity { get; set; }
        [Required]
        [StringLength(50)]
        public string CategoryId { get; set; }
        public CategoryEntity Category { get; set; }
        public ICollection<StorageEntity> Storages { get; set; }
    }

WarehouseEntity

public class WarehouseEntity
    {
        [Key]
        public string WarehouseId { get; set; }
        [Required]
        [StringLength(50)]
        public string WarehouseName { get; set; }
        [MinLength(10)]
        public string WarehouseAddress { get; set; }
        public ICollection<StorageEntity> Storages { get; set; }
    }

StorageEntity

public class StorageEntity
    {
        [Key]
        [StringLength(10)]
        public string StorageId { get; set; }
        [Required]
        public DateTime LastUpdate { get; set; }
        [Required]
        public int PartialQuantity { get; set; }
        [Required]
        public string ProductId { get; set; }
        public ProductEntity Product { get; set; }
        [Required]
        public string WarehouseId { get; set; }
        public WarehouseEntity Warehouse { get; set; }
        public ICollection<InOutsEntity> InOuts { get; set; }

    }

InOutsEntity

public class InOutsEntity
    {
        [Key]
        [StringLength(50)]
        public string InOutsId { get; set; }
        [Required]
        public DateTime InOutDate { get; set; }
        [Required]
        public int Quantity { get; set; }
        [Required]
        public bool IsInput { get; set; }
        [Required]
        public string StorageId { get; set; }
        public StorageEntity Storages { get; set; }
    }
  public class InputOutputEntity
    {
        public string InOutId { get; set; }
        public DateTime InOutDate { get; set; }
        public int Quantity { get; set; }
        public bool IsInput { get; set; }
        public string StorageId { get; set; }
        public StorageEntity Storage { get; set; }
    }```
public class StorageEntity
    {
        [Key]
        [StringLength(50)]
        public string StorageId { get; set; }
        [Required]
        public DateTime LastUpdate { get; set; }
        [Required]
        public int PartialQuantity { get; set; }
        public string ProductId { get; set; }//Identificador del producto.
        public ProductEntity Product { get; set; } //Objeto que contiene el producto.
        public string WherehouseId { get; set; }//Identificador de la bodega.
        public WherehouseEntity Wherehouse { get; set; } //Objeto que contiene la bodega.
        public ICollection<InputOutputEntity> InputOutputs { get; set; } //Lista con todos las entradas/salidas existentes.
    }
<code>public class WherehouseEntity
    {
        [Key]
        [StringLength(50)]
        public string WherehouseId { get; set; }
        [Required]
        [StringLength(100)]
        public string WherehouseName { get; set; }
        [Required]
        [StringLength(100)]
        public string WherehouseAddress { get; set; }
        public ICollection<StorageEntity> Storages { get; set; } //Lista con todos los almacenes existentes.
    }
public class InputOutputEntity
    {
        [Key]
        [StringLength(50)]
        public string InOutId { get; set; }
        [Required]
        public DateTime InOutDate { get; set; }
        [Required]
        public int Quantity { get; set; }
        [Required]
        public bool IsInput { get; set; }
        public string StorageId { get; set; }//Identificador del almacen.
        public StorageEntity Storage { get; set; }//Objeto con el almacen.
    }
Si a este punto al compilar alguno (en Ubuntu) les da error: Versión de MSBuild 17.8.5+b5265ef37 para .NET Determining projects to restore... All projects are up-to-date for restore. Entidades -> /home/nagash/Documentos/net/InventoryApp/Entidades/bin/Debug/net8.0/Entidades.dll /home/nagash/Documentos/net/InventoryApp/Properties/AssemblyInfo.cs(3,12): error CS0579: Atributo 'System.Runtime.Versioning.TargetFramework' duplicado \[/home/nagash/Documentos/net/InventoryApp/InventoryApp.csproj] /home/nagash/Documentos/net/InventoryApp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs(4,12): error CS0579: Atributo 'global::System.Runtime.Versioning.TargetFrameworkAttribute' duplicado \[/home/nagash/Documentos/net/InventoryApp/InventoryApp.csproj] ERROR al compilar. /home/nagash/Documentos/net/InventoryApp/Properties/AssemblyInfo.cs(3,12): error CS0579: Atributo 'System.Runtime.Versioning.TargetFramework' duplicado \[/home/nagash/Documentos/net/InventoryApp/InventoryApp.csproj] /home/nagash/Documentos/net/InventoryApp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs(4,12): error CS0579: Atributo 'global::System.Runtime.Versioning.TargetFrameworkAttribute' duplicado \[/home/nagash/Documentos/net/InventoryApp/InventoryApp.csproj] 0 Advertencia(s) 2 Errores Solo deben agregar estas dos lineas a su InventoryApp.csproj: \<GenerateAssemblyInfo>false\</GenerateAssemblyInfo> \<GenerateTargetFrameworkAttribute>false\</GenerateTargetFrameworkAttribute> quedando algo parecido a esto: \<Project Sdk="Microsoft.NET.Sdk.Web"> \<PropertyGroup> \<TargetFramework>net8.0\</TargetFramework> \<Nullable>enable\</Nullable> \<ImplicitUsings>enable\</ImplicitUsings> \<GenerateAssemblyInfo>false\</GenerateAssemblyInfo> \<GenerateTargetFrameworkAttribute>false\</GenerateTargetFrameworkAttribute> \</PropertyGroup> \</Project>