Académique Documents
Professionnel Documents
Culture Documents
1. Crear una nueva solución en blanco, con nombre Shop. Con esto la tenemos el lienzo
2. Crear en la solución un proyecto .Net Standart; lo llamamos con el nombre del proyecto
Shop.Common. con esto ya tenemos:
3. Ahora continuando con las partes del frontend y Backend, creamos carpetas para cada
uno. (Frontend) y (Backend).
4. Dentro del proyecto Backend creamos un proyecto ASP.NET Core Web Application, con el
nombre Shop.Web de forma model view controller habilitando el HTTPS, y seleccionando
el .NET Core. Con esto ya tendremos
using Common.Models;
using Microsoft.EntityFrameworkCore;
public DataContext(DbContextOptions<DataContext> options) : base(options) Commented [A9]: crear la propiedades que estan
{ en la clase Product y le doy el numbre en singular de
} Products y ya los datos no se los paso como si
fueran tablas sino como una colección de objetos
} por la propiedad Products
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection":
"Server=(localdb)\\ProjectsV13;Database=Shop;Trusted_Connection=True;Mult
ipleActiveResultSets=true"
}
}
10. Para crear o instanciar un nuevo servidor DB lo creamos por comandos del
sistema asi para en este caso “ProjectsV13”
11. Para crear la base de datos Shop en este servidor lo hacemos por comandos del
sistema
Asi ya tenemos la base de datos creada con todas las propiedades.
using System;
using System.Linq;
using System.Threading.Tasks;
using Common.Models;
Para que los datos que ponemos en la clase Seed sean ingresadas a la base de datos
debemos cambiar el programa para que esta clase sea tenida en cuenta en el arranque.
Esto lo hacemos modificando la clase Program con este código.
using Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Common.Models;
public void RemoveProduct(Product product) Commented [A18]: Elimina un product de este producto
{
this.context.Products.Remove(product);
}
public async Task<bool> SaveAllAsync() Commented [A19]: Los metodos anteriores dejan la
{ transaccion pendiente hasta que sea ejecutado este metodo
return await this.context.SaveChangesAsync() > 0; que guarda los cambios en la base de datos.
} Este método es asíncrono por eso tiene el async
Commented [A20]: Espera a que los grave los cambion en
public bool ProductExists(int id) la base de datos
{ Commented [A21]: Devuelve verdadero si existe o falso si
return this.context.Products.Any(p => p.Id == id); ep product no existe
}
}
18. Para crear la interfaz del repositorio le damos clic derecho en la clase (Acciones
rápidas y refactorizables) clic en (Extraer interfaz)
using Data;
using Data.Entities;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
return View(product);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Product product)
{
if (ModelState.IsValid)
{
this.repository.AddProduct(product);
await this.repository.SaveAllAsync();
return RedirectToAction(nameof(Index));
}
return View(product);
}
return View(product);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(Product product)
{
if (ModelState.IsValid)
{
try
{
this.repository.UpdateProduct(product);
await this.repository.SaveAllAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!this.repository.ProductExists(product.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(product);
}
return View(product);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var product = this.repository.GetProduct(id);
this.repository.RemoveProduct(product);
await this.repository.SaveAllAsync();
return RedirectToAction(nameof(Index));
}
}
20. Configurar la inyección del repositorio y para el SeedDb en el startup
services.AddTransient<SeedDb>(); Commented [A22]: El AddTransident tiene un ciclo de
services.AddScoped<IRepository, Repository>(); vida mas corto; se usa y se destruye.
Commented [A23]: AddScoped La inyeccion queda
21. Add User Identities. permanente durante toda la ejecucion para que sea
Creamos una nueva clase en la carpeta Data/Entities con el nombre utilizada las veces que sea necesaria
User.
public class DataContext : IdentityDbContext<User> Commented [A24]: Añadimos la clase User para que lo
{ tome en cuenta junto con todas la tablas de seguridad del
public DbSet<Product> Products { get; set; } sistema
23. Para crear una relación de uno a muchos de la clase Product a la clase
User, en la clase Product adicionamos
1. Drop the database and add the new migrations with those commands:
if (!this.context.Products.Any())
{
this.AddProduct("First Product", user);
this.AddProduct("Second Product", user);
this.AddProduct("Third Product", user);
await this.context.SaveChangesAsync();
}
}
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseCookiePolicy();
app.UseMvc(routes =>
{