具有多对多关系的实体框架中的更新

时间:2013-12-05 13:06:29

标签: entity-framework asp.net-mvc-4

我在我的项目Entity Framework 6.0和ASP NET MVC 4中使用。

我创建了一个Update方法但是当.SaveChanges()插入一个新的Object MEDICAMENTO时,不会更新FKs,relantionship。

这是我的实体:

    public class MEDICAMENTO
    {
        [Key]
        [DisplayName(displayName: "Código")]
        public int CODIGO { get; set; }

        [DisplayName(displayName: "Farmaco")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string FARMACO { get; set; }

        [DisplayName(displayName: "Nome Comercial")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string NOME_COMERCIAL { get; set; }

        [DisplayName(displayName: "Concentração")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string CONCENTRACAO { get; set; }

        [DisplayName(displayName: "Forma Farmaceutica")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string FORMA_FARMACEUTICA { get; set; }

        [DisplayName(displayName: "Data Inclusão")]
        [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public DateTime DATA_INCLUSAO { get; set; }

        [DisplayName(displayName: "Tipo")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string TIPO_MEDICAMENTO { get; set; }

        [DisplayName(displayName: "Código Interno")]
        public string CODIGO_INTERNO { get; set; }

        [DisplayName(displayName: "Categoria")]
        public string CATEGORIA { get; set; }

        public virtual ICollection<MEDICAMENTO_PRESCRITO> MEDICAMENTOS_PRESCRITO { get; set; 
}

    public class PRESCRICAO
    {
        [Key]
        [DisplayName(displayName: "Código")]
        public int CODIGO { get; set; }

        [DisplayName(displayName: "Medicamento Padrão")]
        public bool MEDICAMENTO_PADRAO { get; set; }

        [DisplayName(displayName: "Texto")]
        public string MEDICAMENTO_PADRAO_TEXTO { get; set; }

        [DisplayName(displayName: "Orientação")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public string ORIENTACAO { get; set; }

        [DisplayName(displayName: "Atendimento")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public ATENDIMENTO ATENDIMENTO { get; set; }

        public ICollection<MEDICAMENTO_PRESCRITO> MEDICAMENTOS_PRESCRITO { get; set; }
    }

    public class MEDICAMENTO_PRESCRITO
    {
        [Key]
        [DisplayName(displayName: "Código")]
        public int CODIGO { get; set; }

        [DisplayName(displayName: "Medicamento")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public MEDICAMENTO MEDICAMENTO { get; set; }

        [DisplayName(displayName: "Frequência")]
        public string FREQUENCIA { get; set; }

        [DisplayName(displayName: "Duração")]
        public string DURACAO { get; set; }

        [DisplayName(displayName: "Observação")]
        public string OBSERVACAO { get; set; }

        [DisplayName(displayName: "Prescrição")]
        [Required(ErrorMessage = "Campo Obrigatório!")]
        public PRESCRICAO PRESCRICAO { get; set; }
    }

这是更新方法:

public bool Alterar(PRESCRICAO prescricao)
{
  bool result = false;
  using (cont = new PepContext())
  {
  var temp = cont.PRESCRICAO.Include(a=>a.ATENDIMENTO).Include(m =>     m.MEDICAMENTOS_PRESCRITO).Include("MEDICAMENTOS_PRESCRITO.MEDICAMENTO").Where(p => p.CODIGO == prescricao.CODIGO).First();
   temp.ATENDIMENTO = cont.ATENDIMENTO.Where(a => a.CODIGO == prescricao.ATENDIMENTO.CODIGO).First();
   temp.CODIGO = prescricao.CODIGO;
   temp.MEDICAMENTO_PADRAO = prescricao.MEDICAMENTO_PADRAO;
   temp.MEDICAMENTO_PADRAO_TEXTO = prescricao.MEDICAMENTO_PADRAO_TEXTO;
   temp.ORIENTACAO = prescricao.ORIENTACAO;

   //Delete the old MEDICAMENTO_PRESCRITO list
   foreach (var item in temp.MEDICAMENTOS_PRESCRITO.ToList())
   {
      var tempMed = cont.MEDICAMENTO_PRESCRITO.Where(m => m.CODIGO == item.CODIGO).First();
      cont.MEDICAMENTO_PRESCRITO.Remove(tempMed);
   }


   //Insert the new MEDICAMENTO_PRESCRITO in a temp list
   var novosMedicamentosPrescritos = new List<MEDICAMENTO_PRESCRITO>();
   for (int i = 0; i < prescricao.MEDICAMENTOS_PRESCRITO.Count; i++)
   {
       ovosMedicamentosPrescritos.Add(prescricao.MEDICAMENTOS_PRESCRITO.ElementAt(i));
   }

   //Insert the new MEDICAMENTO_PRESCRITO in temp (PRESCRICAO)
   foreach (var med in novosMedicamentosPrescritos)
    {
       temp.MEDICAMENTOS_PRESCRITO.Add(med);
    }

感谢。

1 个答案:

答案 0 :(得分:0)

有点难以完成您的代码,但如果您想要更新数据库中的实体,则必须使用:

context.Entry(entity).State = EntityState.Modified;

而不是:

context.Entity.Add(entity);

我根本没有看到代码中的第一个。