Baixe o app para aproveitar ainda mais
Prévia do material em texto
Treinamento em C# WebDeveloper Aula 21 Quarta-feira, 19 de Dezembro de 2018 Acesso a banco de dados com EntityFramework. Desenvolvimento com Asp.Net WebApi Modelagem de entidades: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projeto.Entities { public class Usuario { public int IdUsuario { get; set; } public string Nome { get; set; } public string Email { get; set; } public string Senha { get; set; } //Relacionamento de Associação (TER-MUITOS) public List<Perfil> Perfis { get; set; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projeto.Entities { public class Perfil { public int IdPerfil { get; set; } public string Nome { get; set; } //Relacionamento (TER-MUITOS) public List<Usuario> Usuarios { get; set; } } } Instalando o EntityFramework Gerenciador de pacotes do NuGet ORM - Mapeamento Objeto / Relacional Mapeando as classes de entidade using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity.ModelConfiguration; //entityframework (ORM) using Projeto.Entities; //entidades namespace Projeto.Repositories.Mappings { //classe de mapeamento para a entidade Perfil public class PerfilMap : EntityTypeConfiguration<Perfil> { //construtor public PerfilMap() { //nome da tabela ToTable("Perfil"); //chave primária HasKey(p => p.IdPerfil); //demais campos da tabela Property(p => p.IdPerfil) .HasColumnName("IdPerfil"); Property(p => p.Nome) .HasColumnName("Nome") .HasMaxLength(50) .IsRequired(); } } } ----------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.Infrastructure.Annotations; using System.ComponentModel.DataAnnotations.Schema; using Projeto.Entities; namespace Projeto.Repositories.Mappings { public class UsuarioMap : EntityTypeConfiguration<Usuario> { public UsuarioMap() { ToTable("Usuario"); HasKey(u => u.IdUsuario); Property(u => u.IdUsuario) .HasColumnName("IdUsuario"); Property(u => u.Nome) .HasColumnName("Nome") .HasMaxLength(150) .IsRequired(); Property(u => u.Email) .HasColumnName("Email") .HasMaxLength(100) .IsRequired() .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("ix_email") { IsUnique = true })); Property(u => u.Senha) .HasColumnName("Senha") .HasMaxLength(50) .IsRequired(); } } } Mapeando o relacionamento de muitos para muitos: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.Infrastructure.Annotations; using System.ComponentModel.DataAnnotations.Schema; using Projeto.Entities; namespace Projeto.Repositories.Mappings { public class UsuarioMap : EntityTypeConfiguration<Usuario> { public UsuarioMap() { ToTable("Usuario"); HasKey(u => u.IdUsuario); Property(u => u.IdUsuario) .HasColumnName("IdUsuario"); Property(u => u.Nome) .HasColumnName("Nome") .HasMaxLength(150) .IsRequired(); Property(u => u.Email) .HasColumnName("Email") .HasMaxLength(100) .IsRequired() .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("ix_email") { IsUnique = true })); Property(u => u.Senha) .HasColumnName("Senha") .HasMaxLength(50) .IsRequired(); //Mapeamento muitos para muitos HasMany(u => u.Perfis) .WithMany(p => p.Usuarios) .Map( m => { //nome da tabela associativa m.ToTable("UsuarioPerfil"); //chave estrangeira para a tabela de Usuario m.MapLeftKey("IdUsuario"); //chave estrangeira para a tabela de Perfil m.MapRightKey("IdPerfil"); } ); } } } ---------------------------- Classe para acesso ao banco de dados através do EntityFramework: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Configuration; using Projeto.Repositories.Mappings; using Projeto.Entities; namespace Projeto.Repositories.Context { //Regra 1) Herdar DbContext public class DataContext : DbContext { //Regra 2) Criar um construtor que envie //para DbContext a connectionstring public DataContext() : base(ConfigurationManager.ConnectionStrings ["aula20"].ConnectionString) { } //Regra 3) Sobrescrever o método OnModelCreating.. protected override void OnModelCreating(DbModelBuilder modelBuilder) { //adicionar cada classe mapeada.. modelBuilder.Configurations.Add(new PerfilMap()); modelBuilder.Configurations.Add(new UsuarioMap()); //definindo configurações globais de mapeamento //que irão valer para todas as classes Map modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); //desativar a definição de pluralizar nomes de tabelas modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } //Regra 4) Declarar uma propriedade DbSet para cada entidade public DbSet<Perfil> Perfil { get; set; } public DbSet<Usuario> Usuario { get; set; } } } \Web.config.xml <connectionStrings> <add name="aula20" connectionString="Data Source=(LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\COTI\Desktop\Aula_19.12.18\ Aula20\Projeto.Services\App_Data\Banco.mdf;Integrated Security=True" /> </connectionStrings> Fazendo o Migrations PM> enable-migrations -force Checking if the context targets an existing database... Code First Migrations enabled for project Projeto.Repositories. PM> namespace Projeto.Repositories.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration <Projeto.Repositories.Context.DataContext> { public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed (Projeto.Repositories.Context.DataContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. } } } Criando as tabelas: PM> update-database -verbose 8
Compartilhar