如何更新EF中相关表中的数据?

时间:2019-02-14 17:30:22

标签: c# entity-framework

有两种这样的模型:

public class Form
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public Guid FormId { get; set; }

   public string Title { get; set; }

   public string Description { get; set; }

   public List<BlockWorkingForm> BlocksWorkingForm { get; set; }
}


public class BlockWorkingForm
{
   [Key]
   [Column(Order = 1)]
   public string Header { get; set; }

   [Key]
   [Column(Order = 2)]
   public Guid FormId { get; set; }

   public Form Form { get; set; }

   public string Field { get; set; }

   public bool MandatoryQuestion { get; set; }

   public override bool Equals(object obj)
   {
       if (obj == null)
       {
           return false;
       }
       if (!(obj is BlockWorkingForm m))
       {
           return false;
       }

       return m.Header == this.Header
               && m.Field == this.Field
               && m.Type == this.Type
               && m.MandatoryQuestion == this.MandatoryQuestion;
   }
}

还有一种更新模型的方法。

public void UpdateForm(Form form)
{
   EditorFormContext context = new EditorFormContext();

   var formDb = this.context.Forms.Include(x => x.BlocksWorkingForm).Single(x => x.FormId == form.FormId);
   this.context.Entry(formDb).CurrentValues.SetValues(form);

   foreach (var itemForm in form.BlocksWorkingForm)
   {
       if (itemForm.FormId == Guid.Empty)
       {
           itemForm.FormId = formDb.FormId;
           this.context.BlocksWorkingForm.Add(itemForm);
       }
       foreach (var itemFormDb in formDb.BlocksWorkingForm)
       {
           if (itemForm.Header != itemFormDb.Header)
           {
               continue;
           }
           if (!itemForm.Equals(itemFormDb))
           {     
               this.context.Entry(itemFormDb)
                           .CurrentValues.SetValues(itemForm);
           }
       }
   }
   this.context.SaveChanges()
}

现在,它仅允许更新表单中数据库中的“标题”和“描述”字段,以及为表单添加新的块(BlockWorkingForm)。但是仍然有必要实现这些块的删除。

要删除块,我需要比较数据库中的内容和Update方法中的内容,但是该怎么做?

1 个答案:

答案 0 :(得分:0)

this.context.Entry(formDb).CurrentValues.SetValues(form);是在数据库对象中设置属性(标题和描述)的地方。但是未设置BlocksWorkingForm的列表(或设置不正确)。

如果您自己在表单中添加BlocksWorkingForms,则插入应该可以正常工作。

这应该有效。

public void UpdateForm(Form form)
{
   EditorFormContext context = new EditorFormContext();

   var formDb = this.context.Forms.Include(x => x.BlocksWorkingForm).Single(x => x.FormId == form.FormId);
   this.context.Entry(formDb).CurrentValues.SetValues(form);

   formDb.BlocksWorkingForm = form.BlocksWorkingForm;

   this.context.SaveChanges()
}