Как обновить данные в связанной таблице в EF? - PullRequest
0 голосов
/ 14 февраля 2019

Существует две такие модели:

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) для формы.Но все же необходимо реализовать удаление этих блоков.

Чтобы удалить блоки, мне нужно сравнить, что находится в базе данных и что было в методе обновления, но как это можно сделать?

1 Ответ

0 голосов
/ 14 февраля 2019

Это 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...