【问题标题】:How to soft delete with WPF DataGrid and Entity Framework?如何使用 WPF DataGrid 和实体框架软删除?
【发布时间】:2012-02-16 21:28:30
【问题描述】:

假设我有下表:

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()之前做一些处理吗?

【问题讨论】:

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


    【解决方案1】:

    你没有提供很多关于如何使用数据网格的信息,所以我必须做出一些假设。

    如果您希望在用户从数据网格中删除一行时发生“软删除”,您需要启用行删除。您可以通过将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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2014-09-21
      • 2018-01-19
      相关资源
      最近更新 更多