2016-01-11 4 views
0

Я пытаюсь обновить сущность и все ее отношения, и я не уверен, что это возможно. Если это невозможно, каков наилучший способ обойти это?Entity Framework Update Entity

Мои ASP MVC контроллер ...

public ActionResult TimeSheetEdit(Timesheet timesheet, string submitType) 
{ 
    _timesheetRepository.Update(timesheet); 
    _timesheetRepository.Commit(); 

    return RedirectToAction("TimeSheetEdit", new {id=timesheet.TimeSheetId}); 
} 

Мой табель Модель имеет несколько свойств, одно свойство является другое лицо (которое имеет список лиц). Я надеялся, что EF пойдет по всем моим отношениям и обновит все, но похоже, что он обновляет только модель расписания и игнорирует все другие связанные объекты.

Это нормально или я что-то упускаю? Если это нормально, какая практика для достижения того, что я пытаюсь сделать?

Repository Обновить код ...

public void Update(T entity) 
    { 
     _dbSet.Attach(entity); 
     _context.Entry(entity).State = EntityState.Modified; 
    } 

    public int Commit() 
    { 
     return _context.SaveChanges(); 
    } 

Я не уверен, если это поможет, но вот мои модели

Timesheet

public class Timesheet 
    { 
     [Key] 
     public int TimeSheetId { get; set; } 

     public Guid Id { get; set; } 

     public DateTime StartDate { get; set; } 

     public DateTime EndDate { get; set; } 

     public TimeSheetStatus TimeSheetStatus { get; set; } 

     public int EmployeeId { get; set; } 

     public virtual Employee Employee { get; set; } 

     public virtual List<TimesheetLine> TimesheetLines { get; set; } 
    } 

TimesheetLine

public class TimesheetLine 
{ 
    [Key] 
    public int TimeSheetLineId { get; set; } 

    public Guid CustomerId { get; set; } 

    public string CustomerName { get; set; } 

    public Guid EarningsId { get; set; } 

    public virtual List<TimeSheetLineUnit> Units { get; set; } 

    public int TimeSheetId { get; set; } 

    public virtual Timesheet Timesheet { get; set; } 
} 

Время SheetLineUnit

public class TimeSheetLineUnit 
{ 
    [Key] 
    public int UnitId { get; set; } 

    public decimal Hours { get; set; } 

    [DisplayName("Notes")] 
    public string Description { get; set; } 

    public int Index { get; set; } 

    public int TimeSheetLineId { get; set; } 

    public virtual TimesheetLine TimesheetLine { get; set; } 

} 
+0

Put контрольную точку в YOUT ActionResult и посмотреть, является ли вашей собственности (типа другого объекта) имеет обновленный стоимость. – Shyju

+0

Я сделал это. Я могу увидеть обновленное значение всех свойств в методе Controller и Update после отправки моей формы. – Safari137

+0

Одна вещь о MVC заключается в том, что он использует атрибут name для обработки/отправки данных обратно на сервер. Каждое имя в списке дочерних записей должно быть уникальным. – Gwasshoppa

ответ

-1

Пожалуйста, проверьте this:

Может быть, Вам нужно добавить некоторые коды на пути обновления.

Что-то вроде этого:

public void Update(Timesheet timesheet) 
{ 
    var existingParent = _dbContext.Parents 
     .Where(p => p.Id == timesheet.Id) 
     .Include(p => p.TimesheetLines) 
     .SingleOrDefault(); 

    if (existingParent != null) 
    { 
     // Update parent 
     _dbContext.Entry(existingParent).CurrentValues.SetValues(timesheet); 

     // Delete TimesheetLines 
     foreach (var existingChild in existingParent.TimesheetLines.ToList()) 
     { 
      if (!timesheet.TimesheetLines.Any(c => c.Id == existingChild.Id)) 
       _dbContext.TimesheetLines.Remove(existingChild); 
     } 

     // Update and Insert TimesheetLines 
     foreach (var childtimesheet in timesheet.TimesheetLines) 
     { 
      var existingChild = existingParent.TimesheetLines 
       .Where(c => c.Id == childtimesheet.Id) 
       .SingleOrDefault(); 

      if (existingChild != null) 
       // Update child 
       _dbContext.Entry(existingChild).CurrentValues.SetValues(childtimesheet); 
      else 
      { 
       // Insert child 
       var newChild = new Child 
       { 
        Data = childtimesheet.Data, 
        //... 
       }; 
       existingParent.TimesheetLines.Add(newChild); 
      } 
     } 

     _dbContext.SaveChanges(); 
    } 
} 
+0

Я использовал идеи в ссылке, на которую вы ссылались. Я должен был подкорректировать некоторые вещи, но это сработало в конце. Благодарю. – Safari137

+0

Ссылка только ответ обескуражен – Eldho

0

Чтобы попытаться объяснить мой комментарий выше вот что я предлагаю, может быть проблемой.

MVC требуется «Имя» атрибута должно быть уникальным при возврате базы данных в качестве модели на сервер

Я бы перебрать ребенка записывает что-то вроде этого:.

@for (int i = 0; i < Model.Count; i++) 
     { 
     <tr> 
      <td style="text-align: center;" class="Cell"> 
      @Html.CheckBoxFor(m => Model[i].Selected) 
      </td> 
      <td class="Cell"> 
      @Html.DisplayFor(m => Model[i].Name) 
      @Html.HiddenFor(m => Model[i].Name) 
      </td> 
      <td class="Cell"> 
      @Html.DisplayFor(m => Model[i].AddressPhysical) 
      @Html.HiddenFor(m => Model[i].AddressPhysical) 
      </td> 
      <td class="Cell"> 
      @Html.DisplayFor(m => Model[i].AddressPhysicalPostCode) 
      @Html.HiddenFor(m => Model[i].AddressPhysicalPostCode) 
      </td> 
     </tr> 
     } 

Примечание: Если вы делаете это, каждая дочерняя строка в списке будет иметь свой собственный уникальный атрибут «Имя», и MVC сможет однозначно идентифицировать каждую строку данных, и поэтому полные данные будут правильно переданы обратно на сервер в модели.

Это только образец но попробуйте это посмотреть, как вы идете.

+0

Спасибо за ответ. Мой взгляд очень похож на этот. У меня нет никаких проблем с получением правильных данных из моего представления на мой контроллер или в мой репозиторий. Что-то в моем репозитории работает не так, как я ожидал. – Safari137

+0

Ahhh ok ... Извините, не понял, что ... Вы проверили Mappings в Entity Framework, чтобы убедиться, что вы не пропустите никаких отношений, а также отношения базы данных соответствуют этим сопоставлениям? Самая распространенная ошибка, которую я делаю, заключается не в записи карты. – Gwasshoppa

0

для Ef хранилища обновлений не использовать присоединять первый инъекционные вас DbContext в конструкции в вашем родовом хранилище

// my generic repository 
    public class EntityBaseRepository<T>:IEntityBaseRepository<T> 
    where T :class , new() 
{ 
    //my context 
    private DataContext dbContext; 

    // use Dependency injection 
     public EntityBaseRepository(DataContext _dbContext) 
    { 
     this.dbContext = _dbContext; 

    } 


    //update method 
     public void Update(T entity) 
    { 
     DbEntityEntry entry = this.dbContext.Entry(entity); 
     entry.State = EntityState.Modified; 
    } 


} 

// at the end call DbContext SaveChanges() from controller 
Смежные вопросы