繁体   English   中英

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

[英]How to update data in a related table in EF?

有两种这样的模型:

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方法中的内容,但是该怎么做呢?

this.context.Entry(formDb).CurrentValues.SetValues(form); 是在DB对象中设置属性(标题和描述)的位置。 但是未设置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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM