Problem saving a change using Entity Framework

7

I'm trying to persist a change I make in a registry, but I'm getting this error:

  

System.InvalidOperationException: 'A referential integrity constraint   violation occurred: The property value (s) of   'UnitMedida.UndMedidaId' on one end of a relationship do not   match the property value (s) of 'Product.MedidaId' on the other   end. '

I'm using the Entity Framework with Fluent API. The ratio of Produto to UnidadeMedida is *:1 .

I have debugged where I assign the values I receive from my view

public ProdutoViewModel Atualizar(ProdutoViewModel produtoViewModel)
        {
            var categoriaSelecionada =
                _categoriaService.ObterPorId(produtoViewModel.CategoriaId);

            var subCategoriaSelecionada =
                _subCategoriaService.ObterPorId(produtoViewModel.SubCategoriaId);

            var unidadeMedidaSelecionada =
                _unidadeMedidaService.ObterPorId(produtoViewModel.UndidadeMedidaId);

            var produto = Mapper.Map<ProdutoViewModel, Produto>(produtoViewModel);

            produto.Categoria = categoriaSelecionada;
            produto.SubCategoria = subCategoriaSelecionada;
            produto.UnidadeMedida = unidadeMedidaSelecionada;           

            _produtoService.Atualizar(produto);

            return produtoViewModel;
        }

And I see that I get the assignments correctly , but I also see that when it arrives in that code snippet

public virtual TEntity Atualizar(TEntity obj)
        {
            var entry = Db.Entry(obj);
            DbSet.Attach(obj);
            entry.State = EntityState.Modified;
            SaveChanges();

            return obj;
        }

I see that a measure unit reference is null. I can not imagine why ...

My Product Class

using System;

namespace K.Domain.Entities
{
    public class Produto
    {
        public Guid ProdutoId { get; set; }
        public string Descricao { get; set; }
        //public DateTime? Validade { get; set; }
        //public string Lote { get; set; }
        public virtual Categoria Categoria { get; set; }
        public virtual SubCategoria SubCategoria { get; set; }
        public virtual UnidadeDeMedida UnidadeMedida { get; set; }
        public Guid CategoriaId { get; set; }
        public Guid SubCategoriaId { get; set; }
        public Guid UnidadeMedidaId { get; set; }
        //public virtual ICollection<Localizacao> Localizacao { get; set; }
        //public virtual UndAdministrativa UndAdministrativa { get; set; }
        //public DateTime DataCadastro { get; set; }
        //public bool IsMedicamento { get; set; }

        public Produto()
        {
            ProdutoId = Guid.NewGuid();            
        }

        //public bool IsValid
        //{
        //    get
        //    {
        //        return ResultadoValidacao.IsValid;
        //    }
        //}
    }
}

My ProductViewModel class

using K.Domain.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace K.Application.ViewModels
{
    public class ProdutoViewModel
    {
        public ProdutoViewModel()
        {
            ProdutoId = Guid.NewGuid();
            Categorias = new List<CategoriaViewModel>();
            SubCategorias = new List<SubCategoriaViewModel>();
            UnidadeMedidas = new List<UnidadeDeMedidaViewModel>();
        }

        [Key]
        public Guid ProdutoId { get; set; }

        [Required(ErrorMessage = ("Preencha uma descrição."))]
        [MaxLength(120, ErrorMessage = ("Máximo {0} caracteres."))]
        [MinLength(1, ErrorMessage = ("Mínimo {0} caracteres."))]
        [DisplayName("Descrição")]
        public string Descricao { get; set; }

        public IEnumerable<CategoriaViewModel> Categorias { get; set; }
        public IEnumerable<SubCategoriaViewModel> SubCategorias { get; set; }
        public IEnumerable<UnidadeDeMedidaViewModel> UnidadeMedidas { get; set; }

        public Guid CategoriaId { get; set; }
        public Guid SubCategoriaId { get; set; }
        public Guid UndidadeMedidaId { get; set; }

        public virtual Categoria Categoria { get; set; }
        public virtual SubCategoria SubCategoria { get; set; }
        public virtual UnidadeDeMedida UnidadeMedida { get; set; }
    }
}

I will be very happy if someone solves and explains the pq of this error.

    
asked by anonymous 31.05.2017 / 15:19

1 answer

0

Maybe it works like this:

public virtual TEntity Atualizar(TEntity obj)
{

    Db.Entry<TEntity>(obj).State = EntityState.Modified;
    Db.SaveChanges();

    return obj;

}
    
01.06.2017 / 00:34