Write date of inclusion using entity framework

5

I believe there has been a misinterpretation, I am posting the code to be better understood. I'm using a project for my EF Repository inside it I have:

Notice the doubt in //CompanySave.DATA_IND = DateTime.Now; This is possible.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Projeto.Financeiro.Dominio;
using Projeto.Financeiro.Dominio.contrato;

namespace Projeto.Financeiro.RepositorioEF
{
    public class EmpresaRepositorioEF : IRepositorio<tb_empresa>
    {

        private readonly Contexto contexto;

        public EmpresaRepositorioEF()
        {
            contexto = new Contexto();
        }

        //salvar ou altera o registro
        public void SalvarRegistro(tb_empresa entidade)
        {
            if (entidade.IDEMPRESA > 0)
            {
                var empresaAlterar = contexto.Empresa.First(x => x.IDEMPRESA == entidade.IDEMPRESA);
                empresaAlterar.RAZAO_SOCIAL = entidade.RAZAO_SOCIAL;
                empresaAlterar.ENDERECO = entidade.ENDERECO;
                empresaAlterar.BAIRRO = entidade.BAIRRO;
                empresaAlterar.CIDADE = entidade.CIDADE;
                empresaAlterar.IMAGEM_LOGO = entidade.IMAGEM_LOGO;
                empresaAlterar.STATUS = entidade.STATUS;
                empresaAlterar.DATA_ALT = entidade.DATA_ALT;
            }
            else
            {
                //empresaSalvar.DATA_IND = DateTime.Now; isso é possivel
                contexto.Empresa.Add(entidade);
            }

            contexto.SaveChanges();
        }

        //excluir o registro
        public void ExcluirRegistro(tb_empresa entidade)
        {

            var empresaExcluir = contexto.Empresa.First(x => x.IDEMPRESA == entidade.IDEMPRESA);
            contexto.Set<tb_empresa>().Remove(empresaExcluir);
            contexto.SaveChanges();
        }

        //listar por id
        public tb_empresa ListarPorId(string id)
        {
            int idInt;
            Int32.TryParse(id, out idInt);
            return contexto.Empresa.First(x => x.IDEMPRESA == idInt);
        }

        //listar todos
        public IEnumerable<tb_empresa> ListarTodos()
        {
            return contexto.Empresa;
        }


    }
}

My Entity

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Projeto.Financeiro.RepositorioEF
{
     public interface IEntidade
     {
          DateTime DATA_ALTERACAO { get; set; }
          DateTime DATA_INCLUSAO { get; set; }
     }
}

My Context:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Projeto.Financeiro.Dominio;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Validation;

namespace Projeto.Financeiro.RepositorioEF
{
    public class Contexto:DbContext
    {

        public  Contexto() : base("BancoDados")
        {

        }


        public override int SaveChanges()
        {
            var Contexto = ((IObjectContextAdapter)this).ObjectContext;

            IEnumerable<ObjectStateEntry> objectStateEntries =
            from e in Contexto.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
            where
                e.IsRelationship == false &&
                e.Entity != null &&
                typeof(IEntidade).IsAssignableFrom(e.Entity.GetType())
            select e;

            var dataAtual = DateTime.Now;

            foreach (var entry in objectStateEntries)
            {
                dynamic entityBase = entry.Entity;

                if (entry.State == EntityState.Added || entityBase.DataCriacao == DateTime.MinValue)
                {
                    entityBase.DATA_INCLUSAO = dataAtual;

                }

                entityBase.DATA_ALTERACAO = dataAtual;
            }

            try
            {
                return base.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage);
                    }
                }
                throw;
            }
        }


        public DbSet<tb_empresa> Banco { get; set; }





        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        }


    }
}
    
asked by anonymous 17.09.2015 / 03:06

1 answer

6

The correct way is to update the dates in the SaveChanges context:

    public override int SaveChanges()
    {
        var context = ((IObjectContextAdapter)this).ObjectContext;

        IEnumerable<ObjectStateEntry> objectStateEntries =
            from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
            where
                e.IsRelationship == false &&
                e.Entity != null &&
                typeof(IEntidade).IsAssignableFrom(e.Entity.GetType())
            select e;

        var dataAtual = DateTime.Now;

        foreach (var entry in objectStateEntries)
        {
            dynamic entityBase = entry.Entity;

            if (entry.State == EntityState.Added || entityBase.DataCriacao == DateTime.MinValue)
            {
                entityBase.DataCriacao = dataAtual;

            }

            entityBase.UltimaModificacao = dataAtual;
        }

        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            foreach (var eve in e.EntityValidationErrors)
            {
                Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().Name, eve.Entry.State);
                foreach (var ve in eve.ValidationErrors)
                {
                    Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                        ve.PropertyName, ve.ErrorMessage);
                }
            }
            throw;
        }
    }

Reading the code, note that you will have to make your Models implement IEntidade , whose code is below:

public interface IEntidade
{
    DateTime UltimaModificacao { get; set; }
    DateTime DataCriacao { get; set; }
}

IEntidade forces your Models to have a creation date and one of the last modification. You do not need to put anything in Controller : context does it all alone.

    
17.09.2015 / 07:22