C# - WPF实体框架 - 从数据库中删除所选记录

时间:2018-01-29 23:23:18

标签: c# wpf entity-framework

在我的C#/ WPF应用程序中,我有一个ListView控件,我填充如下:

private void Load()
{
    DbSet<recordHistory> recordHistory = _db.recordHistories;

    var query = from cbHistory in recordHistory
                orderby cbHistory.id descending
                select new { cbHistory.id, cbHistory.Content, cbHistory.Size, cbHistory.DateAdded };
    crRecordHistoryList.ItemsSource = query.ToList();
}

以上工作符合预期。我的ListView控件填充了SQL数据库中的所有已保存记录。

当我开始调试应用程序时,它会按预期执行。但是,当我选择其中一个ListView项目(无论我选择哪个项目)并点击Remove按钮时,只会从数据库中删除第一条记录 ListView控件。

预期的行为是从数据库&amp;中删除选定的记录。 listview控件...

我的Remove方法

private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
    foreach (var record in _db.recordHistories.Local.ToList())
    {
        Console.WriteLine("Removing Record Id:" + record.id);
        _db.recordHistories.Remove(record);
    }

    _db.SaveChanges();

    this.crRecordHistoryList.Items.Refresh();
    this.Load();
}

此外,所有后续项目选择和单击删除按钮都不会导致从数据库/列表视图控件中删除任何内容。

我还在Remove方法中尝试了以下内容(只是为了获取ID):

Console.WriteLine("Removing Record Id:" + (crRecordHistoryList.SelectedItem as recordHistory).id);

在这种情况下,我得到:

  

System.NullReferenceException:&#39;对象引用未设置为对象的实例。&#39;

我的recordHistory课程(自动生成)

using System;
using System.Collections.Generic;

public partial class recordHistory
{
    public int id { get; set; }
    public string Content { get; set; }
    public string Size { get; set; }
    public Nullable<int> DateAdded { get; set; }
}

编辑:我已经想出为什么它只删除了第一条记录,然后没有其他事情发生(无论选择哪个项目)......这是因为从Local获取记录(在我的foreach声明中),我应该简单地进行以下操作 - 这是我最初的尝试,试图将ID输出到Console:< / p>

private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
    recordHistory testRecord = new recordHistory();
    testRecord.id = (recordHistory)crRecordHistoryList.SelectedItem;
    _db.recordHistories.Attach(testRecord);
    _db.recordHistories.Remove(testRecord);
    _db.SaveChanges();
    this.crRecordHistoryList.Items.Refresh();
    this.Load();
}

但是,以下一行

testRecord.id = (recordHistory)crRecordHistoryList.SelectedItem;

正在抛出错误:

  

无法隐式转换类型&#39; recordHistory&#39;到&#39; int&#39;

顺便说一下:如果我用第testRecord.id = 85;替换第二行,上面的方法就会完美。

因此,我尝试将上述行更改为以下内容,但无济于事:

testRecord.id = System.Convert.ToInt32(crRecordHistoryList.SelectedItem);

如何删除所选记录?

1 个答案:

答案 0 :(得分:0)

感谢@ pinkfloydx33指出我正确的方向。根据他的评论,我冒险进一步研究兔子洞,最终导致我创建了一个DTO课程并修改了我的LoadRemove方法,如下所示 -

Load方法

private void Load()
{
    List<HistoryRecordsDTO> records = (from record in _db.recordHistories
                                        orderby record.id descending
                                        select new HistoryRecordsDTO
                                        {
                                            id = record.id,
                                            Content = record.Content,
                                            Size = record.Size,
                                            DateAdded = record.DateAdded
                                        }).ToList();
    crRecordHistoryList.ItemsSource = records;
}

Remove方法

private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
    recordHistory record = new recordHistory();
    record.id = (crRecordHistoryList.SelectedItem as HistoryRecordsDTO).id;
    _db.recordHistories.Attach(record);
    _db.recordHistories.Remove(record);
    _db.SaveChanges();
    this.crRecordHistoryList.Items.Refresh();
    this.Load();
}

而且,我的DTO班级 - HistoryRecordsDTO

public class HistoryRecordsDTO
{
    public int id { get; set; }
    public string Content { get; set; }
    public string Size { get; set; }
    public Nullable<int> DateAdded { get; set; }
}

执行上述操作解决了我删除所选ListView项目的问题。

作为一名C#/ WPF新手,我确信在一般方面有更好的/最佳的/更好的...我期待其他答案并从中学习。