如何使用WPF DataGrid和Entity Framework进行软删除?

时间:2012-02-16 11:57:49

标签: .net wpf entity-framework-4 datagrid savechanges

假设我有下表:

CREATE TABLE EXAMPLETABLE (
     ID NUMBER(10,0) NOT NULL,
     DELETIONDATE DATE, 
     NAME VARCHAR2(100 CHAR) NOT NULL, 
     UNIQUE (DELETIONDATE, NAME));

如何从WPF DataGrid软删除项目?软删除操作如下:

UPDATE EXAMPLETABLE 
SET DELETIONDATE = NOW()
WHERE ID = SOMEID;

我应该处理KeyPress事件吗? 在表单中我有一个保存按钮,我应该在调用entities.SaveChanges()之前做一些处理吗?

1 个答案:

答案 0 :(得分:2)

您没有提供有关如何使用数据网格的大量信息,因此我必须做出一些假设。

如果您希望在用户从数据网格中删除行时发生“软删除”,则需要启用删除行。您可以将CanUserDeleteRows设置为True

我假设您正在使用某种数据绑定来绑定数据网格中的行。删除行时,ItemsSource中的基础对象将从该集合中删除。如果您使用实现INotifyCollectionChanged的集合(如ObservableCollection),则会在发生这种情况时触发事件。

您可以通过将DeletionDate设置为DateTime.Now来收听该事件并相应地修改基础模型对象。然后,您必须致电entities.SaveChanges()将该更改推送到数据库。

private void ReloadData()
{
    var viewSource = (CollectionViewSource)this.FindResource("aTableViewSource");
    var aTableRows = new ObservableCollection<aTable>
    (
        this.entities.aTable
            .Where(fibra => !fibra.DELETIONDATE.HasValue)
            .Take(10)
            .ToList()
    );

    fibras.CollectionChanged += EventHandler;
    fibrasViewSource.Source = aTableRows;
}

void EventHandler(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        foreach(var oldItem in e.OldItems)
        {
            ((aTable)oldItem).DELETIONDATE = DateTime.Now;
        }
    }
}