Редактировать сущность в новом окне в wpf - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть окно, которое показывает список сущностей, и я хочу отредактировать выбор вида сетки в новом окне (не в сетке). Когда я отправляю свою форму, ошибки не возникает, но объект не имеет изменений в базе данных! пожалуйста, помогите мне.

в верхней части моего списка окна код позади:

            private ObservableCollection<Employee> AllEmployeesData { get; set; }
            private ListCollectionView View;

и в window_loaded я использую этот метод для получения данных:

public void LoadAllEmployees()
    {
        IEnumerable<Employee> data = null;
        using (ArchiveEntities db = new ArchiveEntities())
        {
            data = db.Employees.Include("Department");
            this.AllEmployeesData = new ObservableCollection<Employee>(data);
        }
        CollectionViewSource employeeSource = (CollectionViewSource)this.FindResource("AllEmployeesDataSource");
        employeeSource.Source = this.AllEmployeesData;
        this.View = (ListCollectionView)employeeSource.View;
    }

Событие нажатия кнопки Edit:

            EditEmployeeView win = new EditEmployeeView();
            View.EditItem(SelectedEmployee);
            win.DataContext = SelectedEmployee;

            if ((bool)win.ShowDialog())
            {
                using (ArchiveEntities db = new ArchiveEntities())
                {
                    Employee employee = db.Employees.Single(x => x.Id == SelectedEmployee.Id);
                    db.Employees.ApplyCurrentValues(employee);
                    db.SaveChanges();
                    View.CommitEdit();
                }
            }
            else
            {
                View.CancelEdit();
            }

весь приведенный выше код находится в моем первом окне (окно, которое показывает список объектов). и в моем втором окне (окно для редактирования выбранного элемента первого окна):

событие нажатия кнопки submit:

        DialogResult = true;
        Close();

Моя проблема: при отправке формы редактирования ошибка не возникает, но данные не сохраняются в базе данных, и когда я отменяю форму редактирования, я получаю эту ошибку:

Исключительная ситуация InvalidOperationException: CancelEdit не поддерживается для текущего элемента редактирования.

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Отказ от использования в datacontext - это очень плохой подход для структуры сущностей!

Если вы закроете свой текстовый текст перед сохранением, все результаты сущности будут отключены и сохранены как безрезультатные.

Попробуйте таким образом, используйте контекст на уровне класса, оставайтесь на связи и используйте всю мощь работы над сущностью

public mainClass{

  private ArchiveEntities db;
  private ObservableCollection<Employee> allEmployeesData;
  private Employee selctedEmplyee;

  // property in binding
   public ObservableCollection<Employee> AllEmployeesData { get{return allEmployeesData;} set{allEmployeesData=value; onPropertyChanged("AllEmployeesData"); }
   public Employee SelctedEmplyee { get{return selctedEmplyee;} set{selctedEmplyee=value; onPropertyChanged("SelctedEmplyee"); }

  mainWindow (){ //Constructor

  db=new ArchiveEntities();
  }

  private void onedit(){
     new detailWindow(SelectedEmployee).ShowDialog();
     //reload from db, upadte current element  if modified in the detail window
     SelectedEmployee = db.Employees.Single(x => x.Id == SelectedEmployee.Id);
  }

  //no need to save in main window (is only for view)

}

public class detailWindow(){

  private ArchiveEntities db;
  private Employee selctedEmplyee;

  //employee to modify
  public Employee SelctedEmplyee { get{return selctedEmplyee;} set{selctedEmplyee=value; onPropertyChanged("SelctedEmplyee"); }


  public detailWindow(Employee SelectedEmployee){

    db=new ArchiveEntities; // a new indipendent context
    SelectedEmployee = db.Employees.Single(x => x.Id == SelectedEmployee.Id);
  }

  public void onSave(){
    db.SaveChanges(); //effect only in SelectedEmployee
    // if you don'save main window data will not change
  }


}
1 голос
/ 14 декабря 2011

почему вы используете View.EditItem, View.CommitEdit и View.CancelEdit? все, что вам нужно, это ваш win.DataContext = SelectedEmployee. что я не получаю, когда вы устанавливаете ваши новые отредактированные данные для вашей сущности?

using (ArchiveEntities db = new ArchiveEntities())
{
    Employee employee = db.Employees.Single(x => x.Id == SelectedEmployee.Id);
    db.Employees.ApplyCurrentValues(employee);
    db.SaveChanges();
    View.CommitEdit();
 }

вы получаете сотрудника из базы данных, но не применяете отредактированные данные из SelectedEmployee к своему сотруднику. или я что-то пропустил?

SelectedEmployee - это сущность из вашей базы данных

data = db.Employees.Include("Department");
this.AllEmployeesData = new ObservableCollection<Employee>(data);

так почему вы не используете его и не сохраняете обратно в db?

db.SaveChanges(SelectedEmployee );
0 голосов
/ 20 февраля 2018

Класс Employee должен реализовывать IEditableObject, пример которого вы можете увидеть здесь: https://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx После этой реализации он должен работать как положено

...