3
001 using System; 002 using System.Collections.Generic; 003 using System.ComponentModel.DataAnnotations.Schema; 004 using System.Data.Entity; 005 using System.Linq; 006 007 using EF.Auditoria.ContextoEF; 008 009 namespace EF.Auditoria 010 { 011 class Program 012 { 013 static void Main(string[] args) 014 { 015 //Criando um contexto para inserir uma entidade 016 using (var ctx = new Contexto()) 017 { 018 //Inserindo uma entidade pessoa e roupa. 019 ctx.Pessoa.Add(new Pessoa() { Nome = "Fernando", Roupa = new Roupa() { Descricao = "Bermuda" } }); 020 021 //Enviando as informações ao banco de dados 022 ctx.SaveChanges(); 023 } 024 } 025 } 026 027 028 //Entidade com atributo Auditar, informando que deve ser gravado na tabela Auditoria 029 [Auditar] 030 public class Pessoa 031 { 032 public int Id { get; set; } 033 public string Nome { get; set; } 034 public Roupa Roupa { get; set; } 035 } 036 037 038 //Entidade sem o atributo Auditar, informando que não deve ser gravado na tabela Auditoria 039 public class Roupa 040 { 041 public int Id { get; set; } 042 public string Descricao { get; set; } 043 } 044 045 //Entidade sem o atributo auditar, e responsável por conter as entidades auditadas 046 public class Auditoria 047 { 048 public int Id { get; set; } 049 050 public string Dado { get; set; } 051 052 //Enum Tipo Operação (Inserir, Alterar e Deletar) 053 public TipoOperacao TipoOperacao { get; set; } 054 055 } 056 057 //Enum para informar o tipo de operação que está sendo auditado 058 public enum TipoOperacao 059 { 060 061 Inserir = 1, 062 Alterar = 2, 063 Deletar = 3 064 065 } 066 067 068 //Classe que será serializado no formato json, não será mapeada pela EF 069 [NotMapped] 070 public class Entidade 071 { 072 073 public Entidade(string entidadeNome) 074 { 075 this.EntidadeNome = entidadeNome; 076 DataAuditoria = DateTime.Now; 077 Campos = new List<EntidadeCampo>(); 078 } 079 080 public DateTime DataAuditoria { get; set; } 081 public string EntidadeNome { get; set; } 082 public EntidadeChave Chave { get; set; } 083 public List<EntidadeCampo> Campos { get; set; } 084 085 } 086 087 //Classe que contera os dados da chave primária da entidade, como o nome da chave e seu valor 088 //essa class será serializado no formato json e não será mapeada pela EF 089 [NotMapped] 090 public class EntidadeChave 091 { 092 public string Nome { get; set; } 093 public object Valor { get; set; } 094 } 095 096 //Classe que para as informações do nome do campo que foi alterado como os valores, antes e depois 097 [NotMapped] 098 public class EntidadeCampo 099 { http://nandosilva.com.br/post/Criando-um-modelo-de-Auditoria-com-E... 1 de 3 19/10/2015 14:49

Auditori Aef

  • Upload
    dev-crc

  • View
    214

  • Download
    0

Embed Size (px)

DESCRIPTION

efwfw

Citation preview

Page 1: Auditori Aef

001 using System;002 using System.Collections.Generic;003 using System.ComponentModel.DataAnnotations.Schema;004 using System.Data.Entity;005 using System.Linq;006007 using EF.Auditoria.ContextoEF;008009 namespace EF.Auditoria010 {011 class Program012 {013 static void Main(string[] args)014 {015 //Criando um contexto para inserir uma entidade016 using (var ctx = new Contexto())017 {018 //Inserindo uma entidade pessoa e roupa.019 ctx.Pessoa.Add(new Pessoa() { Nome = "Fernando", Roupa = new Roupa() { Descricao = "Bermuda" } });020021 //Enviando as informações ao banco de dados022 ctx.SaveChanges();023 }024 }025 }026027028 //Entidade com atributo Auditar, informando que deve ser gravado na tabela Auditoria029 [Auditar]030 public class Pessoa031 {032 public int Id { get; set; }033 public string Nome { get; set; }034 public Roupa Roupa { get; set; }035 }036037038 //Entidade sem o atributo Auditar, informando que não deve ser gravado na tabela Auditoria 039 public class Roupa040 {041 public int Id { get; set; }042 public string Descricao { get; set; }043 }044045 //Entidade sem o atributo auditar, e responsável por conter as entidades auditadas046 public class Auditoria047 {048 public int Id { get; set; }049050 public string Dado { get; set; }051052 //Enum Tipo Operação (Inserir, Alterar e Deletar)053 public TipoOperacao TipoOperacao { get; set; }054055 }056057 //Enum para informar o tipo de operação que está sendo auditado058 public enum TipoOperacao059 {060061 Inserir = 1,062 Alterar = 2,063 Deletar = 3064065 }066067068 //Classe que será serializado no formato json, não será mapeada pela EF069 [NotMapped]070 public class Entidade071 { 072073 public Entidade(string entidadeNome)074 {075 this.EntidadeNome = entidadeNome;076 DataAuditoria = DateTime.Now;077 Campos = new List<EntidadeCampo>();078 }079080 public DateTime DataAuditoria { get; set; }081 public string EntidadeNome { get; set; }082 public EntidadeChave Chave { get; set; }083 public List<EntidadeCampo> Campos { get; set; }084085 }086087 //Classe que contera os dados da chave primária da entidade, como o nome da chave e seu valor088 //essa class será serializado no formato json e não será mapeada pela EF089 [NotMapped]090 public class EntidadeChave091 {092 public string Nome { get; set; }093 public object Valor { get; set; }094 }095096 //Classe que para as informações do nome do campo que foi alterado como os valores, antes e depois097 [NotMapped]098 public class EntidadeCampo099 {

http://nandosilva.com.br/post/Criando-um-modelo-de-Auditoria-com-E...

1 de 3 19/10/2015 14:49

Page 2: Auditori Aef

100 public EntidadeCampo(string nomePropriedade, string valorAntes, string valorDepois)101 {102 this.NomePropriedade = nomePropriedade;103 this.ValorAntes = valorAntes;104 this.ValorDepois = ValorDepois;105 }106 public string NomePropriedade { get; set; }107 public string ValorAntes { get; set; }108 public string ValorDepois { get; set; }109 }110111 //Atributo auditar, entidades decoradas com esse atributo deverá ser auditada112 public class Auditar : System.Attribute113 { }114115 //Contexto116 public class Contexto : DbContext117 {118 public DbSet<Pessoa> Pessoa { get; set; }119 public DbSet<Auditoria> Auditoria { get; set; }120121122 protected override void OnModelCreating(DbModelBuilder modelBuilder)123 {124 //Tirando o pluralize do EF125 modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();126127 base.OnModelCreating(modelBuilder);128 }129130 //Sobreescrevendo o saveChanges do contexto atual131 public override int SaveChanges()132 {133 //Detectando as alterações.134 ChangeTracker.DetectChanges();135136 //Objeto Json que será serializado e guardado no banco de dados137 string objectJson = string.Empty;138139140 //pega o objeto do contexto atual141 System.Data.Entity.Core.Objects.ObjectContext contexto =((System.Data.Entity.Infrastructure.IObjectContextAdapter)this).ObjectContext;142143 //pega do tracking somente as entidades (adicionada, modificadas e deletas)144 List<System.Data.Entity.Core.Objects.ObjectStateEntry> objectStateEntryList =contexto.ObjectStateManager.GetObjectStateEntries145 (System.Data.Entity.EntityState.Added |146 System.Data.Entity.EntityState.Modified |147 System.Data.Entity.EntityState.Deleted).ToList();148149 //percorre entidade a entidade e os relacionamentos também150 foreach (System.Data.Entity.Core.Objects.ObjectStateEntry entry in objectStateEntryList)151 {152 //os entry que não são entidade serão ignoradas153 if (!entry.IsRelationship)154 {155156 //verifica se a entidade possui o atributo para auditar157 var auditar = entry.Entity.GetType().GetCustomAttributes(typeof(Auditar), true).ToList().Count() > 0;158159 if (auditar)160 {161 //Começa preenchar a entidade de auditoria162 var auditoria = new Auditoria();163 var entidade = new Entidade(entry.EntitySet.Name);164165 //chama uma extension para buscar a chave da auditoria166 entidade.Chave = entry.ObterChaveEntidade(entry.State);167168 //informa o tipo de operação que está sendo auditado169 auditoria.TipoOperacao = entry.State.ObterTipoOperacao();170171172 //Cria um switch dos três estados da entidade173 switch (entry.State)174 {175176 case EntityState.Added:177 { 178179 //Percorre as propriedades das entidades180 foreach (var propriedade in entry.CurrentValues.DataRecordInfo.FieldMetadata)181 {182 //pega o nome da propriedade183 var nomePropriedade = propriedade.FieldType.Name;184185 //para o estado de inserção, só o valor current está dispoinivel186 var valor = entry.CurrentValues.ObterValorAtual(nomePropriedade);187188 var entidadeCampo = new EntidadeCampo(nomePropriedade, string.Empty, valor);189 entidade.Campos.Add(entidadeCampo);190 }191192 }193194 break;195 case EntityState.Deleted:196 {197 //Percorre as propriedades das entidades

http://nandosilva.com.br/post/Criando-um-modelo-de-Auditoria-com-E...

2 de 3 19/10/2015 14:49

Page 3: Auditori Aef

198 foreach (var propriedade in entry.CurrentValues.DataRecordInfo.FieldMetadata)199 {200 //pega o nome da propriedade201 var nomePropriedade = propriedade.FieldType.Name;202203 //para o estado de deletar só o valor original está dispoinivel204 var valorAntes = entry.OriginalValues.ObterValorOriginal(nomePropriedade);205206 var entidadeCampo = new EntidadeCampo(nomePropriedade, valorAntes, string.Empty);207 entidade.Campos.Add(entidadeCampo);208209 }210 break;211 }212213 case EntityState.Modified:214 {215 //Percorre as propriedades das entidades modificadas216 foreach (var nomePropriedade in entry.GetModifiedProperties())217 {218 //busca os valores original219 var valorAntes = entry.OriginalValues.ObterValorOriginal(nomePropriedade);220 //busca os valores que estão sendo informados221 var valorDepois = entry.CurrentValues.ObterValorAtual(nomePropriedade);222223 var entidadeCampo = new EntidadeCampo(nomePropriedade, valorAntes, valorDepois);224 entidade.Campos.Add(entidadeCampo);225226 }227 break;228 }229 }230231 //serializa o entidade no formato json, aqui pode criar uma interface e injetar o formato daserialização como por exemplo um xml.232 objectJson = entidade.SerializeToJson();233 //coloca o objeto serializado no campo dado da entidade auditoria234 auditoria.Dado = objectJson;235236 this.Auditoria.Add(auditoria);237 }238239 }240 }241242 //agora da o SaveChanges do contexto243 return base.SaveChanges();244 }245 }246 }

http://nandosilva.com.br/post/Criando-um-modelo-de-Auditoria-com-E...

3 de 3 19/10/2015 14:49