0

i have a window that shows a list of entities and i want to edit the selecteitem of gridview in a new window (Not in grid). when i submit my form no error occurred but entity have no changes in database! please help me.

in top of my list window code behind:

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

and in window_loaded i use this method for fetch data:

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;
    }

Editbutton click event:

            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();
            }

all of the above code is in my first window (window that shows a list of entities). and in my second window (window for edit selected item of a first window):

submitbutton click event:

        DialogResult = true;
        Close();

my problem is: when i submit edit form no error occurred but data dont save in database and when i cancel edit form i get this error:

InvalidOperationException was unhandled: CancelEdit is not supported for the current edit item.

4

3 回答 3

1

远离数据上下文中的“使用”对于实体框架来说是一种非常糟糕的方法!

如果您在保存之前关闭数据上下文,则所有实体结果都会断开连接并另存为无结果。

尝试这种方式,使用类级别上下文,保持连接并使用实体框架的所有功能

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
  }


}
于 2011-12-14T20:53:23.247 回答
1

为什么使用 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();
 }

您从 db 获取员工,但您没有将 SelectedEmployee 中的编辑数据应用于您的员工。还是我错过了什么?

SelectedEmployee 是您数据库中的一个实体

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

那么为什么你不使用它并将其保存回数据库呢?

db.SaveChanges(SelectedEmployee );
于 2011-12-14T10:29:34.357 回答
0

Employee 类必须实现 IEditableObject 你可以在这里看到一个例子:https ://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx 在这个实现之后,它应该可以按预期工作

于 2018-02-20T04:22:24.420 回答