Pop

Tensorflow.Tutorial Pix2Pix. 2.Elegimos nuestro dataset

2.Elegimos nuestro dataset y empezamos con el código

  • Antes de comenzar con la implementación de nuestro código es necesario tener claro  el problema que queremos solucionar en nuestro caso queremos generar fachadas  a partir de bocetos. Hemos utilizado el dataset que google nos proporciona. En el siguiente vídeo lo explicamos mejor:
  • Vamos a empezar a con el código.
#importamos las librerias necesarias.
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import time
import matplotlib.pyplot as plt
from IPython.display import clear_output
import tensorflow as tf #IMPORTANTE TENER VERSIÓN 2.0
print(tf.__version__ )

#En esta porción de código descargamos el dataset de imagenes

_URL = 'https://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/facades.tar.gz'
#Ruta local donde descomprimosmos el fichero zip con el dataset de imágenes
path_to_zip = tf.keras.utils.get_file('facades.tar.gz',origin=_URL,extract=True)
PATH = os.path.join(os.path.dirname(path_to_zip), 'facades/')
print(PATH)

#definimos algunas constantes que utilizaremos posteriormente

BUFFER_SIZE = 400
BATCH_SIZE = 1
IMG_WIDTH = 256  #Ancho de las imagenes
IMG_HEIGHT = 256 #Alto de las imagenes

#función que carga las imágenes y las devuelve
def load(image_file):
    image = tf.io.read_file(image_file) #carga la imagen de disco
    image = tf.image.decode_jpeg(image) # la decodificamos a jpg

    w = tf.shape(image)[1]

    w = w // 2
    real_image = image[:, :w, :]
    input_image = image[:, w:, :]

    input_image = tf.cast(input_image, tf.float32) #cast para pasarlas a float para los calculos 
    real_image = tf.cast(real_image, tf.float32)

    return input_image, real_image
#cargamos imagen de entrenamiento
inp, re = load(PATH+'train/2.jpg')
plt.figure()
plt.imshow(inp/255.0)
plt.figure()
plt.imshow(re/255.0)

#Función para redimensionar las imágenes.
#Se le pasan como paramteros las imágenes y sus tamaños.Llamamos
#al método de TS resize y las devuelve.

def resize(input_image, real_image, height, width):
  input_image = tf.image.resize(input_image, [height, width],
                                method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
  real_image = tf.image.resize(real_image, [height, width],
                               method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)

  return input_image, real_image
  
  #función que coge una parte de la imágenes pasadas como parámetros
def random_crop(input_image, real_image):
  stacked_image = tf.stack([input_image, real_image], axis=0)
  cropped_image = tf.image.random_crop(
      stacked_image, size=[2, IMG_HEIGHT, IMG_WIDTH, 3])

  return cropped_image[0], cropped_image[1]
 # Normalizamos.Queremos que las imágenes estén en el rango de 
#[-1,1].Como las imágenes son de de tamaño 256 dividimos entre 127.5 y 
#restamos 1
def normalize(input_image, real_image):
  input_image = (input_image / 127.5) - 1
  real_image = (real_image / 127.5) - 1

  return input_image, real_image
  
 #Funcíon que se utiliza para aumentación de datos.Aplicancdo está función se
#generan virtualmente más imágenes a base de ampliar las imagenes y desplazarlas.
@tf.function()
def random_jitter(input_image, real_image):
  # aumentamos el tamaño 286 x 286 x 3 (canales de color)
  input_image, real_image = resize(input_image, real_image, 286, 286)

  # cogemos una parte de la imagen (256 x 256 x 3) anteriormente ampliada a 286 x 286 x 3  
  input_image, real_image = random_crop(input_image, real_image)

  if tf.random.uniform(()) > 0.5:
    # Volteamos la imagen horizontalmente
    input_image = tf.image.flip_left_right(input_image)
    real_image = tf.image.flip_left_right(real_image)

  return input_image, real_image
  
  # Probamos las funciones
# 1. Cambiar el tamaño de una imagen a mayor altura y ancho
# 2. Recorte aleatoriamente al tamaño original
# 3. Voltear aleatoriamente la imagen horizontalmente

plt.figure(figsize=(6, 6))
for i in range(4):
  rj_inp, rj_re = random_jitter(inp, re)
  plt.subplot(2, 2, i+1)
  plt.imshow(rj_inp/255.0)
  plt.axis('off')
plt.show()

#función para cargar imágenes de entrenamiento
def load_image_train(image_file):
  input_image, real_image = load(image_file)
  input_image, real_image = random_jitter(input_image, real_image)
  input_image, real_image = normalize(input_image, real_image)

  return input_image, real_image
  
  #función para cargar imagen de test.En la función de test NO aplicamos
#el aumento de datos (función random_jitter)
def load_image_test(image_file):
  input_image, real_image = load(image_file)
  input_image, real_image = resize(input_image, real_image,
                                   IMG_HEIGHT, IMG_WIDTH)
  input_image, real_image = normalize(input_image, real_image)

  return input_image, real_image

Tensorflow.Tutorial Pix2Pix. 1.Introducción

1.Introducción

  • En pix2pix la red se compone de dos piezas principales: el Generador y el Discriminador. El generador aplica alguna transformación a la imagen de entrada para obtener la imagen de salida. El Discriminador compara la imagen de entrada con una imagen desconocida , ya sea una imagen objetivo del conjunto de datos o una imagen de salida del generador e intenta adivinar si fue producida por el generador. 
  • Concepto GAN: Una GAN es un modelo generativo en el que dos redes compiten en un escenario de teoría de juegos. La primera red es el generador, genera una muestra (por ejemplo, una imagen), mientras que su adversario, el discriminador,  intenta detectar si una muestra es real o si es el resultado del generador. En pocas palabras, GAN significa que dos redes funcionan una contra la otra. Primero se alimenta con datos en bruto que se descompone. A partir de estos, trata de crear una imagen. Luego lo envía a otra red que,  solo tiene fotos o imágenes reales en su base de datos. Esta segunda red hará un juicio de la imagen e informará a la primera.Si la imagen no se parece al resultado esperado, el primer algoritmo reanuda el proceso. Si hay una coincidencia, se le informa que está en el camino correcto y  termina por entender qué es una buena imagen.
  • En el siguiente vídeo podéis verlo con más detalles:






Curso .NET Core en C# - 22.Cómo instalar y usar Bootstrap.

22.Cómo instalar y usar Bootstrap.

  • Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos. 

  • En este vídeo discutiremos cómo instalar y usar Bootstrap en ASP.NET Core.. Bootstrap es una biblioteca multiplataforma o conjunto de herramientas de código abierto para diseño de sitios y aplicaciones web. Contiene plantillas de diseño con tipografía, formularios, botones, cuadros, menús de navegación y otros elementos de diseño basado en HTML y  CSS, así como extensiones de JavaScript adicionales.

  • Para instalar el paquete de  Bootstrap utilizaremos Library Manager (LibMan para abreviar). Library Manager es una herramienta ligera de adquisición de bibliotecas del lado del cliente. Para poder usar LibMan, debe tener Visual Studio 2017 versión 15.8 o posterior.
  • En el siguiente vídeo podemos ver como instalarlo:

  • Os dejo parte del código visto en el vídeo:
libman.json
{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "library": "twitter-bootstrap@4.3.1",
      "destination": "wwwroot/lib/twitter-bootstrap/"
    }
  ]
}

_Layout.cshtml

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/css/sitio.css" rel="stylesheet" />
    <link href="~/lib/twitter-bootstrap/css/bootstrap.css" rel="stylesheet" />
  
    <title>@ViewBag.Title</title>
</head>
<body>
    <div>
        @RenderBody()
    </div>


    @RenderSection("Scripts",required:false)
</body>
</html>


Index.cshtml
@model List<Amigo>

@{


    ViewBag.Title = "Amigos indice";

}



<div class="card-deck">
    @foreach (var amigo in Model)
    {
        <div class="card m-3">
            <div class="card-header">
                <h3>@amigo.Nombre</h3>
            </div>
            <img class="card-img-top" src="~/images/ChicaCodigo.jpg" />
            <div class="card-footer text-center">
                <a href="#" class="btn btn-primary">Ver</a>
                <a href="#" class="btn btn-primary">Editar</a>
                <a href="#" class="btn btn-danger">Borrar</a>
            </div>
        </div>
    }
</div>

DetallesView.cshtml

@model DetallesView

@{
ViewBag.Title = "Amigos Detalles";
}

    <div class="row justify-content-center m-3">
        <div class="col-sm-8">
            <div class="card">
                <div class="card-header">
                    <h1>@Model.amigo.Nombre</h1>
                </div>

                <div class="card-body text-center">
                    <img class="card-img-top" src="~/images/ChicaCodigo.jpg" />

                    <h4>Amigo ID : @Model.amigo.Id</h4>
                    <h4>Email:  @Model.amigo.Email</h4>
                    <h4>Ciudad: @Model.amigo.Ciudad</h4>

                </div>
                <div class="card-footer text-center">
                    <a href="#" class="btn btn-primary">Volver</a>
                    <a href="#" class="btn btn-primary">Editar</a>
                    <a href="#" class="btn btn-danger">Borrar</a>
                </div>
            </div>
        </div>
    </div>


@section  Scripts
{
    <script src="~/js/MiScript.js"></script>
}


Curso diseño de bases de datos 5.Nuevo ejemplo completo

5.  Nuevo ejemplo completo

  • Hola a todos. En esta serie de vídeos pretendo diseñar una base de datos partiendo de unas especificaciones iniciales proporcionadas por un cliente. En este cuarto vídeo creamos nuestro diseño de base de datos con gestor  el de base de datos SQL SERVER.
  • En este capítulo resolvemos al completo el siguiente problema. Desde el diseño del modelo entidad/relación al diseño de las tablas de nuestra base de datos:
Se desea informatizar la gestión de una tienda informática. La tienda dispone de una serie
de productos que se pueden vender a los clientes.

“De cada producto informático se desea guardar el código, descripción, precio y número
de existencias. De cada cliente se desea guardar el código, nombre, apellidos, dirección y
número de teléfono.
Un cliente puede comprar varios productos en la tienda y un mismo producto puede ser
comprado por varios clientes. Cada vez que se compre un artículo quedará registrada la
compra en la base de datos junto con la fecha en la que se ha comprado el artículo.
La tienda tiene contactos con varios proveedores que son los que suministran los
productos. Un mismo producto puede ser suministrado por varios proveedores. De cada
proveedor se desea guardar el código, nombre, apellidos, dirección, provincia y número
de teléfono”.

  • Os dejo el vídeo con la solución de este problema:

Curso .NET Core en C# - 21.Enrutamiento en MVC

21. Enrutamiento en MVC

  • Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos. 
  • En este vídeo, analizaremos el enrutamiento en ASP.NET Core MVC. Hay 2 técnicas de enrutamiento. Enrutamiento convencional y enrutamiento de atributos. Cuando una solicitud del navegador llega a nuestra aplicación, es el controlador en el patrón de diseño MVC, el que maneja la solicitud HTTP entrante   responde a la acción del usuario.
  • En el vídeo veremos las diferentes maneras de gestionar las rutas en MVC:

  • Con el enrutamiento de atributos, las rutas se colocan al lado de los métodos de acción que realmente las usarán. Las rutas de atributos ofrecen un poco más de  flexibilidad que las rutas convencionales. Sin embargo, en general, las rutas convencionales se utilizan para controladores que sirven páginas HTML  y rutas de atributos para controladores que sirven API REST. 
  • Os dejo parte del código visto en el vídeo:
    • Clase HomeController:

Enrutamiento con Atributos:
using Ejemplo1.Models;
using Ejemplo1.ViewModels;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Ejemplo1.Controllers
{
    public class HomeController:Controller
    {
        private IAmigoAlmacen amigoAlmacen;

        public HomeController(IAmigoAlmacen AmigoAlmacen)
        {
            amigoAlmacen = AmigoAlmacen;
        }

        //public string Index()
        //{
        //    return amigoAlmacen.dameDatosAmigo(3).Email;
        //}

        //public JsonResult Details()
        //{
        //    Amigo modelo = amigoAlmacen.dameDatosAmigo(1);
        //    return Json(modelo);
        //}
        [Route("")]
        [Route("Home")]
        [Route("Home/Index")]
        public ViewResult Index(int id)
        {
            var modelo = amigoAlmacen.DameTodosLosAMigos();
            return View(modelo);
        }
        [Route("Home/Details/{id?}")]
        public ViewResult Details(int? id)
        {
        
            DetallesView detalles = new DetallesView();
            //Si es nulo forzamo a qque busque los detalles del amigo uno
            detalles.amigo= amigoAlmacen.dameDatosAmigo(id?? 1);
            detalles.Titulo = "LISTA AMIGOS VIEW MODELS";
            detalles.SubTitulo = "XXXXXXXXXXXX";

            return View(detalles);
        }
}
}
    • Clase Startup:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace Ejemplo1
{
    public class Startup
    {

        private IConfiguration _configuration;

        public Startup(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddSingleton<IAmigoAlmacen, MockAmigoRepositorio>();
         

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env )
        {

            if (env.IsDevelopment())
            {
                DeveloperExceptionPageOptions d = new DeveloperExceptionPageOptions
                {
                    SourceCodeLineCount = 2
                };
                app.UseDeveloperExceptionPage(d);
            }
            else if (env.IsProduction() || env.IsStaging())
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();
            //app.UseMvcWithDefaultRoute();

            app.UseMvc();
            //app.UseMvc(routes =>
            //{
            //    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id}");
            //});

        }
    }
}

Curso .NET Core en C# - 20.Archivos _ViewStart.cshtml y _ViewImports.cshtm

20.Archivos  _ViewStart.cshtml y _ViewImports.cshtm

  • Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.

  • En este vídeo, analizaremos para que se usan los  archivos _ViewStart.cshtml y _ViewImports.cshtm en ASP.NET Core MVC. Cuando usamos una vista de diseño tenemos que asociarla manualmente en cada vista en la que la queramos usar. Pero con el archivo _ViewStart.cshtml, esto no es necesario. De esta forma evitamos el código redundante. Se trata de un archivo especial en ASP.NET Core MVC. El código en este archivo se ejecuta antes de que se ejecute el código en una vista individual. Esto significa que, en lugar de establecer la propiedad Diseño en cada vista individual, podemos mover ese código al archivo _ViewStart.cshtml.


  • Por otra parte el  archivo _ViewImports.cshtml generalmente se coloca en la carpeta Vistas. Se utiliza para incluir los espacios de nombres comunes, por lo que no tenemos que incluirlos en todas las vistas que necesitan esos espacios de nombres.Al igual que el archivo _ViewStart, el archivo _ViewImports también es jerárquico. Además de colocarlo en la carpeta Vistas, también podemos colocar otras _ViewImports en la subcarpeta "Inicio" en la carpeta Vistas.


Curso .NET Core en C# - 19.Aprende como utilizar Layout View en MVC

19.Aprende como utilizar Layout View en MVC

  • Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.

  • En este vídeo hablaremos sobre la vista de diseño Layout View en ASP.NET Core MVC. La mayoría de las aplicaciones web en general suelen tener una cabecera, un pie de página, un menú de navegación y el contenido de la página. La vista de diseño surge con el objetivo de no tener que repetir estas estructuras en cada vista. En lugar de tener todas estas secciones, en todas y cada una de las vistas, podemos definirlas en una vista de diseño y luego heredar ese aspecto en todas las vistas. 



    • Con las vistas de diseño, es mucho más fácil mantener la apariencia consistente en todas las vistas, ya que solo tenemos que modificar un archivo de diseño, en caso de que haya algún cambio. El cambio se reflejará inmediatamente en todas las vistas de toda nuestra aplicación.

    Curso diseño de bases de datos 4.Pasamos el diagrama E/R a tablas

    4.  Diagrama E/R a tablas

    • Hola a todos. En esta serie de vídeos pretendo diseñar una base de datos partiendo de unas especificaciones iniciales proporcionadas por un cliente. En este cuarto vídeo creamos nuestro diseño de base de datos con gestor  el de base de datos SQL SERVER.
    • Antes de ir con el diseño de tablas de base de datos es necesario tener claro  los siguientes conceptos:
      •  Entidades Cada entidad del modelo E-R genera una tabla. Dicha tabla contiene como columnas cada uno de los atributos de la entidad. Además puede contener otras columnas fruto de relaciones, normalmente1:N, con otras entidades.
      •  Relaciones: Dependiendo de cómo se definan las cardinalidades de las relaciones, éstas pueden generar una tabla o por el contrario traducirse en columnas dentro de las tablas asociadas a las entidades que participan en dicha relación. 
    • En el vídeo vemos como hemos creado nuestro diseño de base de datos:
    • Os dejo el script sql para crear las diferentes tablas:
    CREATE TABLE [dbo].[CANASTA](
    [IdCanasta] [int] IDENTITY(1,1) NOT NULL,
    [Minuto] [datetime] NOT NULL,
    [TipoCanasta] [varchar](36) NOT NULL,
    [Puntos] [int] NOT NULL,
    [IdPartido] [int] NOT NULL,
     CONSTRAINT [PK_CANASTA] PRIMARY KEY CLUSTERED 
    (
    [IdCanasta] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[EQUIPO](
    [IdEquipo] [int] IDENTITY(1,1) NOT NULL,
    [Codigo] [varchar](36) NOT NULL,
    [Nombre] [varchar](500) NOT NULL,
    [Ciudad] [varchar](250) NOT NULL,
    [Aforo] [int] NOT NULL,
    [Estadio] [varchar](250) NOT NULL,
    [Fundacion] [datetime] NOT NULL,
     CONSTRAINT [PK_EQUIPO] PRIMARY KEY CLUSTERED 
    (
    [IdEquipo] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[JUGADOR](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Codigo] [varchar](36) NOT NULL,
    [Nombre] [varchar](255) NOT NULL,
    [IdPosicion] [int] NOT NULL,
    [FechaNacimiento] [datetime] NOT NULL,
    [IdEquipo] [int] NOT NULL,
     CONSTRAINT [PK_JUGADOR] PRIMARY KEY CLUSTERED 
    (
    [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[PARTIDO](
    [IdPartido] [int] IDENTITY(1,1) NOT NULL,
    [Codigo] [varchar](36) NOT NULL,
    [PuntosCasa] [int] NOT NULL,
    [PuntosVisitantes] [int] NOT NULL,
    [Fecha] [datetime] NOT NULL,
     CONSTRAINT [PK_PARTIDO] PRIMARY KEY CLUSTERED 
    (
    [IdPartido] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[PRESIDENTE](
    [IdPresidente] [int] IDENTITY(1,1) NOT NULL,
    [Dni] [varchar](36) NOT NULL,
    [Nombre] [varchar](250) NOT NULL,
    [Apellidos] [varchar](250) NOT NULL,
    [FechaEleccion] [datetime] NOT NULL,
    [FechaNac] [datetime] NOT NULL,
    [IdEquipo] [int] NOT NULL,
     CONSTRAINT [PK_PRESIDENTE] PRIMARY KEY CLUSTERED 
    (
    [IdPresidente] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[REL_PARTIDO_EQUIPOS](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [IdPartido] [int] NOT NULL,
    [IdEquipoLocal] [int] NOT NULL,
    [IdEquipoVisitante] [int] NOT NULL,
     CONSTRAINT [PK_REL_PARTIDO_EQUIPOS] PRIMARY KEY CLUSTERED 
    (
    [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[CANASTA]  WITH CHECK ADD  CONSTRAINT [FK_CANASTA_PARTIDO] FOREIGN KEY([IdPartido])
    REFERENCES [dbo].[PARTIDO] ([IdPartido])
    GO

    ALTER TABLE [dbo].[CANASTA] CHECK CONSTRAINT [FK_CANASTA_PARTIDO]
    GO

    ALTER TABLE [dbo].[JUGADOR]  WITH CHECK ADD  CONSTRAINT [FK_JUGADOR_EQUIPO] FOREIGN KEY([IdEquipo])
    REFERENCES [dbo].[EQUIPO] ([IdEquipo])
    GO

    ALTER TABLE [dbo].[JUGADOR] CHECK CONSTRAINT [FK_JUGADOR_EQUIPO]
    GO

    ALTER TABLE [dbo].[PRESIDENTE]  WITH CHECK ADD  CONSTRAINT [FK_PRESIDENTE_EQUIPO] FOREIGN KEY([IdEquipo])
    REFERENCES [dbo].[EQUIPO] ([IdEquipo])
    GO

    ALTER TABLE [dbo].[PRESIDENTE] CHECK CONSTRAINT [FK_PRESIDENTE_EQUIPO]
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS]  WITH CHECK ADD  CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_EQUIPO] FOREIGN KEY([IdEquipoLocal])
    REFERENCES [dbo].[EQUIPO] ([IdEquipo])
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS] CHECK CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_EQUIPO]
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS]  WITH CHECK ADD  CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_EQUIPO1] FOREIGN KEY([IdEquipoVisitante])
    REFERENCES [dbo].[EQUIPO] ([IdEquipo])
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS] CHECK CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_EQUIPO1]
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS]  WITH CHECK ADD  CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_PARTIDO] FOREIGN KEY([IdPartido])
    REFERENCES [dbo].[PARTIDO] ([IdPartido])
    GO

    ALTER TABLE [dbo].[REL_PARTIDO_EQUIPOS] CHECK CONSTRAINT [FK_REL_PARTIDO_EQUIPOS_PARTIDO]
    GO

    Curso .NET Core en C# - 18.Aprende como utilizar List view en MVC

    18. Aprende como utilizar ListView  en MVC

    • Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.

    • En este vídeo, veremos como utilizar ListView en las vistas de asp.net core. Veremos esto con un ejemplo. La idea es recuperar a todos nuestros amigos desde el modelo  y mostrarlos en una página web como muestro en el vídeo:

    • Os dejo el código de las clases vistas en el vídeo:  
      • interface IAmigoAlmacen
    public interface IAmigoAlmacen
        {
           Amigo dameDatosAmigo(int Id);
           List<Amigo> DameTodosLosAmigos()
    }

      • Clase MockAmigoRepositorio

    namespace Ejemplo1.Models
    {
        public class MockAmigoRepositorio:IAmigoAlmacen
        {
            private List<Amigo> amigosLista;

            public MockAmigoRepositorio()
            {
                amigosLista = new List<Amigo>();
                amigosLista.Add(new Amigo() { Id = 1, Nombre = "Pedro", Ciudad = "Madrid", Email = "Pedro@mail.com" });
                amigosLista.Add(new Amigo() { Id = 2, Nombre = "Juan", Ciudad = "Toledo", Email = "Juan@mail.com" });
                amigosLista.Add(new Amigo() { Id = 3, Nombre = "Sara", Ciudad = "Cuenca", Email = "Sara@mail.com" });
            }

            public Amigo dameDatosAmigo(int Id)
            {
                return this.amigosLista.FirstOrDefault(e => e.Id == Id);
            }

            public List<Amigo> DameTodosLosAmigos()
            {
                return amigosLista;
            }
        }
    }

      • código modificado en el controlador:

           public ViewResult Index()
            {
                var modelo = amigoAlmacen.DameTodosLosAmigos();
                return View(modelo);
            }
      • Código de la vista:
    @model List<Ejemplo1.Models.Amigo>
    <html>
    <head>
    </head>
    <body>

        <table>
            <tr>
                <th>ID</th>
                <th>Nombre</th>
                <th>Email</th>
                <th>Ciudad</th>
            </tr>
            <tr>
                @foreach (var amigo in Model)
                {
            <tr>
                <td>
                    @amigo.Id
                </td>
                <td>
                    @amigo.Nombre
                </td>
                <td>
                    @amigo.Email
                </td>
                <td>
                    @amigo.Ciudad
                </td>
            </tr>
                }

         </table>
    </body>
    </html>

    Curso .NET Core en C# - 34.Creamos nuestro propio log

    34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...