0

我正在迁移基于类型化数据集的 WPF 应用程序以使用 Entity Framework 5 Code First (.Net 4.5)。

我目前使用 DataSet 中的数据加载模型。然后将模型字段绑定到 XAML DataGrids。使用模型中的 ObservableCollections 和从 INotifyPropertyChanged 派生的域对象的组合,我可以获得在集合和域对象级别正在进行的 CRUD 操作并采取相应的行动:

public class DomainObject : INotifyPropertyChanged
{
  public DataRowState State;
 ...
} 

public class Model
{
  private ObservableCollection<DomainObject> _family = new ObservableCollection<DomainObject>();

  public Model()
  {
    List<DomainObject> objs = DS.GetObjects();
    foreach ( var obj on objs )
    {
     obj.PropertyChanged += OnObjectChanged;       
     _family.Add(obj);
    }

    _family.CollectionChanged += OnCollectionChanged;
  }

 void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 {
  // do stuff against DataSet based on e.Action
  ...
 }

 private void OnObjectChanged(object sender, PropertyChangedEventArgs e)
 {
   // do stuff against DataSet based on sender's (DomainObject) State property.
   ...
 }
}

在我当前的实现中,当用户按下按钮时,我可以在将数据集中的 CRUD 操作写入数据库之前对它们进行伪批处理Save,或者如果按下取消,则丢弃 DataSet。

EF DbContext 的使用模式是否类似于我在使用 DataSet 填充模型时的使用方式?如果您希望能够保存对象更新,那么 Context 似乎必须在模型的整个生命周期内一直存在。

感谢您的任何指导!科里。

4

1 回答 1

0

我认为您所要求的是使用 DbContext 的一些 Undo/Redo 实现,为此请查看本文,并且我看到您正在使用 WPF,因此您应该尝试使用IEditableObject 接口来实现此机制。另一方面,DbContext 必须一直存在,直到您在对该上下文进行任何修改后调用 save changes。

于 2013-03-10T22:57:05.423 回答