Conocer las bases de .NET core

1

¿Qué necesitas para aprender a desarrollar aplicaciones profesionales en .NET con Blazor?

2

Todo lo que aprenderás sobre Blazor

3

Evolución de .Net

4

¿Cómo funciona el Desarrollo Web sin Blazor?

5

Instalando Visual Studio Community

6

Instalando SQL Server Express

Entender la estructura de Blazor

7

Webassemblies y .Net Core 3

8

Anatomía de una aplicación Blazor

9

Blazor pages

10

Blazor components

11

Introducción a formularios

12

Inyección de dependencias

Aplicar Entity Framework

13

Arquitectura vs. Patrones de Diseño

14

Estructurando nuestro proyecto

15

¿En qué consiste Entity Framework y por qué vamos a trabajarlo?

16

Creación de entidades

17

Data annotations

18

Trabajando el relacionamiento entre entidades

19

Creando el datacontext

20

Migraciones

21

Alimentando la base de datos

Integrar datos en ambientes Blazor

22

Construyendo la capa intermedia o capa de negocio

23

El CRUD de integración de datos

24

Creación de formularios con Blazor

25

Finalizando el formulario

26

Trabajando listas de datos

27

Agregando filtros a nuestra lista

28

Guardando nuevos registros

29

Creación formulario de actualización de datos

30

Aplicando actualización de datos

31

Registrando productos en almacenamiento

32

Creando página de almacenamiento

33

Cargando productos por Bodega para entradas y salidas

34

Relacionando productos y formulario de entradas y salidas

35

Finalizando el formulario de entradas y salidas

Aplicar Diseño con Bootstrap

36

Revisión de estilos: Introducción a Bootstrap

37

Publicando el sitio

38

Cierre del curso

No tienes acceso a esta clase

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

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

20 Días
1 Hrs
22 Min
42 Seg

Trabajando el relacionamiento entre entidades

18/38
Recursos

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>