Controller Edit - Inserting Values

2

My method responsible for editing is inserting values into the CONSUL_EnciclopediasCONSUL_Promocoes table instead of editing. If I have the options x with id = 1 and y id = 2 within the course a with id = 1 and I originally choose the option x , my table gets 1 and 1. If I edit and now I choose the y option, my table holds 1 and 1 and also inserts 1 and 2. >

Domain Encyclopedias

 public class CONSUL_Enciclopedias
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public string Descricao { get; set; }
        public string PrazoEntrega { get; set; }
        public string Banner { get; set; }
        public string Foto { get; set; }
        public string LinkLoja { get; set; }
        public string DataEnvio { get; set; }
        public bool Ativo { get; set; }
        public virtual ICollection<CONSUL_Promocoes> Promocoes { get; set; }

    }

Domain Promotions

public class CONSUL_Promocoes
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public string Foto { get; set; }
        public string Descricao { get; set; }
        public bool Ativo { get; set; }
        public virtual ICollection<CONSUL_Enciclopedias> Enciclopedias { get; set; }

    }

My table CONSUL_EnciclopediasCONSUL_Promocoes gets CONSUL_Enciclopedias_ID and also CONSUL_Promocoes_ID

My edit method in my Controller Encyclopedia

[CustomActionFilter]
[AcceptVerbs(HttpVerbs.Post)]
public PartialViewResult Edit(int id, CONSUL_Enciclopedias Enciclopedias, FormCollection collection)
{
    PromocoesAplicacao bdPromocoes;
    EnciclopediasAplicacao bdEnciclopedia;
    bdPromocoes = PromocoesAplicacaoConstrutor.PromocoesAplicacaoEF();
    bdEnciclopedia = EnciclopediasAplicacaoConstrutor.EnciclopediasAplicacaoEF();

    var enciclopedia = bdEnciclopedia.ListarPorId(id.ToString());
    var promoBD = bdPromocoes.ListarTodos();
    var listaCombo = new List<CONSUL_Promocoes>();

    if (!string.IsNullOrEmpty(collection["Promocoes"]))
    {
        var promos = collection["Promocoes"].ToString().Split(',');

        foreach (var promo in promos)
        {
            listaCombo.Add(promoBD.First(c => c.ID.ToString() == promo));
        }
    }

    Enciclopedias.Promocoes = listaCombo;
    bdEnciclopedias.Salvar(Enciclopedias);
    return null;
}

Repository

public class EnciclopediasRepositorioEF : IRepositorio<CONSUL_Enciclopedias>
{
    private readonly Contexto contexto;

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

    public void Salvar(CONSUL_Enciclopedias entidade)
    {
        if (entidade.ID > 0)
        {
            var EnciclopediasAlterar = contexto.Enciclopedias.First(x => x.ID == entidade.ID);
            EnciclopediasAlterar.PrazoEntrega = entidade.PrazoEntrega;
            EnciclopediasAlterar.Banner = entidade.Banner;
            EnciclopediasAlterar.Nome = entidade.Nome;
            EnciclopediasAlterar.Descricao = entidade.Descricao;
            EnciclopediasAlterar.Foto = entidade.Foto;
            EnciclopediasAlterar.LinkLoja = entidade.LinkLoja;
            EnciclopediasAlterar.Ativo = entidade.Ativo;
            EnciclopediasAlterar.DataEnvio = entidade.DataEnvio;
            EnciclopediasAlterar.CONSUL_Promocoes = entidade.CONSUL_Promocoes.Select(promo => contexto.Promocoes.FirstOrDefault(y => y.ID == promo.ID)).ToList();
        }
        else
        {
            entidade.CONSUL_Promocoes.Select(promo => contexto.Promocoes.FirstOrDefault(y => y.ID == promo.ID)).ToList();
            contexto.Enciclopedias.Add(entidade);
        }
        contexto.SaveChanges();
    }

    public void Excluir(CONSUL_Enciclopedias entidade)
    {
        var cartaAlterar = contexto.Enciclopedias.First(x => x.ID == entidade.ID);

        contexto.Set<CONSUL_Enciclopedias>().Remove(cartaAlterar);
        contexto.SaveChanges();
    }

    public IEnumerable<CONSUL_Enciclopedias> ListarTodos()
    {
        return contexto.Enciclopedias.Include(x => x.CONSUL_Promocoes).ToList();
    }

    public CONSUL_Enciclopedias ListarPorId(string id)
    {
        int idInt;
        Int32.TryParse(id, out idInt);
        return contexto.Enciclopedias.Include(x => x.CONSUL_Promocoes).FirstOrDefault(x => x.ID == idInt);
    }
}
    
asked by anonymous 12.09.2014 / 19:49

1 answer

4

Another example of the classic problem of highlighted context.

When you do this:

bdPromocoes = PromocoesAplicacaoConstrutor.PromocoesAplicacaoEF();
bdEnciclopedia = EnciclopediasAplicacaoConstrutor.EnciclopediasAplicacaoEF();

You are creating two separate contexts that do not know the information that each monitors. So even if the record already exists, the context will understand that it is a new record.

My suggestion is to instantiate the context in the Controller and build the application classes with it:

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

public EnciclopediasRepositorioEF(Contexto contexto)
{
    this.contexto = contexto;
}

And then:

var contexto = new Contexto();

bdPromocoes = PromocoesAplicacaoConstrutor.PromocoesAplicacaoEF(contexto);
bdEnciclopedia = EnciclopediasAplicacaoConstrutor.EnciclopediasAplicacaoEF(contexto);

Another problem I consider is its modeling. You modeled like this:

public virtual ICollection<CONSUL_Enciclopedias> Enciclopedias { get; set; }
public virtual ICollection<CONSUL_Promocoes> Promocoes { get; set; }

This does not produce an associative table alone. You need to explain by the Fluent API that there is such an association (I'm not much of a fan of this approach personally), or else model an extra Model that associates the two ):

public class EnciclopediaPromocao 
{
    [Key]
    public int EnciclopediaPromocaoId { get; set; }
    [Index("IUQ_EnciclopediaPromocao_EnciclopediaId_PromocaoId", IsUnique = true, Order = 1)]
    public int EnciclopediaId { get; set; }
    [Index("IUQ_EnciclopediaPromocao_EnciclopediaId_PromocaoId", IsUnique = true, Order = 2)]
    public int PromocaoId { get; set; }

    public virtual Enciclopedia Enciclopedia { get; set; }
    public virtual Promocao Promocao { get; set; }
}

And then change the associations in the two Models , Enciclopedia and Promocao :

public virtual ICollection<EnciclopediaPromocao> EnciclopediaPromocoes { get; set; }

[Index] , introduced in this form from the Entity Framework 6.1.0, guarantees the uniqueness of the associative register. Additional validations may be required in the application to avoid extraneous errors of key duplication for the user.

    
12.09.2014 / 20:54