如何取消,撤消实体框架改变了?

时间:2013-12-03 20:25:42

标签: c# wpf entity-framework

我已将Entity对象绑定到我的UI(WPF),一个Edit People窗口,当我更改任何阵营并单击按钮Save时,它会将其保存在我的数据库中,关闭窗口并更新listPeople( DataGrid),在我的保存按钮中只有休闲代码(db是我的DbContext

    private void Inserir_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            db.Peoples.Add(people);
            db.SaveChanges();
            MessageBox.Show("Register saved");
            this.Close();
        }
        catch { }
    }

这是有效的,但我有一个问题,当我更改任何阵营并单击关闭按钮时,它不会保存在DB中,但我的更改已更新为listPeople 单击关闭按钮时我需要,我的DbContext将所有值重置为原始值(如果编辑,添加或删除,请将其撤消)

关闭按钮事件

    private void btClose_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }

PeopleEdit.Closed事件

    private void listPeople_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (listPeople.SelectedItem == null)
            return;

        Dados.People p = listPeople.SelectedItem as Dados.People;
        EditPeopleep = new EditPeople(p);
        ep.Closed += (s, arg) => { listPeople.ItemsSource = db.Peoples.ToList(); };
        ep.ShowDialog();
    }

1 个答案:

答案 0 :(得分:1)

不要在对话框中编辑Person。获取副本并进行编辑。

如果用户单击“确定”,则保存更改。

var p = listPeople.SelectedItem as Dados.People;
var vm = new PersonViewModel{Name = p.Name, Tel=p.Tel};
var ep = new EditPeople(vm);
if(ep.ShowDialog()){
    p.Name = vm.Name;
    p.Tel = vm.Tel;
    db.SaveChanges();
}

对于创建人,

var vm = new PersonViewModel{Name = "name", Tel="tel"};
var ep = new EditPeople(vm);
if(ep.ShowDialog()){
    var p = new Dados.People();
    p.Name = vm.Name;
    p.Tel = vm.Tel;
    db.Peoples.Add(p);
    db.SaveChanges();
}

可以使用Undo-Redo系统,但这非常复杂。

你应该使PersonViewModel实现INotifyPropertyChanged,然后你可以在对话框中绑定它。

public class PersonViewModel:INotifyPropertyChanged
{
    private string _name;
    public string Name{ get{return _name;}
                        set{ SetProperty(ref _name, value);}}
    private string _tel;
    public string Tel{ get{return _tel;}
                        set{ SetProperty(ref _tel, value);}}

    public PropertyChangedEventHandler PropertyChanged;

    private void SetProperty<T>(ref T field, T value, 
         [CallerMemberName] string name = ""){
         field = value;
         if(PropertyChanged != null)
             PropertyChanged(this, new PropertyChangedEventArgs(name));


    }



}

如果ViewModel中有许多属性,请使用Automapper复制它们。