Wpf EF Code First-填充模型时上下文的持续时间

Wpf EF Code First-填充模型时上下文的持续时间,wpf,entity-framework,model,Wpf,Entity Framework,Model,我正在迁移一个基于类型化数据集的WPF应用程序,以便首先使用Entity Framework 5代码(.Net 4.5) 我当前使用数据集中的数据加载模型。然后将模型字段绑定到XAML数据网格。通过组合使用模型中的ObservableCollections和从INotifyPropertyChanged派生的域对象,我可以获得在集合和域对象级别正在进行的CRUD操作,并相应地采取行动: public class DomainObject : INotifyPropertyChanged {

我正在迁移一个基于类型化数据集的WPF应用程序,以便首先使用Entity Framework 5代码(.Net 4.5)

我当前使用数据集中的数据加载模型。然后将模型字段绑定到XAML数据网格。通过组合使用模型中的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.
   ...
 }
}
公共类DomainObject:INotifyPropertyChanged
{
公共数据行状态;
...
} 
公共类模型
{
私有ObservableCollection _family=新ObservableCollection();
公共模型()
{
List objs=DS.GetObjects();
foreach(objs上的var obj)
{
obj.PropertyChanged+=OnObjectChanged;
_添加(obj);
}
_family.CollectionChanged+=OnCollectionChanged;
}
CollectionChanged无效(对象发送方,NotifyCollectionChangedEventArgs e)
{
//基于e.Action对数据集执行操作
...
}
对象已更改的私有void(对象发送方,PropertyChangedEventArgs e)
{
//根据发送方的(DomainObject)状态属性对数据集执行操作。
...
}
}
在我当前的实现中,当用户按下
Save
按钮时,我能够在将CRUD操作写入数据库之前对数据集中的CRUD操作进行伪批处理,或者如果按下Cancel,数据集将被丢弃

EF DbContext使用它是否可以接受,就像我在填充模型时使用数据集一样?如果您希望能够保存对象更新,那么在模型的生命周期中,上下文似乎必须一直存在

谢谢你的指导!
Corey.

我认为您需要的是使用DbContext的一些撤销/重做实现,因为我看到您正在使用WPF,所以您应该尝试使用这种机制。另一方面,DbContext必须一直存在,直到您对该上下文进行任何修改后调用save changes。

如果您在系统中使用域对象,当用户单击save按钮时,您应该能够执行以下操作:启动DbContext(在using语句中),使用linq获取EF对象,通过读取域对象执行EF对象的更新,在DbContext上调用SaveChanges。这可能是一个有用的链接,谢谢!如果域对象是派生类,那么我是否需要为每个基类编写一个复制操作符来将更新迁移到EF保持对象?是的,您可以这样做。事实上,您可以将复制操作符设置为虚拟,以便在必要时可以重写派生类。就个人而言,我更喜欢在服务类中抽象逻辑。