簡體   English   中英

C#-WPF實體框架-從數據庫中刪除選定的記錄

[英]C# - WPF Entity Framework - Remove Selected Record from Database

在我的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控件中刪除。

預期的行為是將所選記錄從數據庫和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:'對象引用未設置為對象的實例。

我的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

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;

拋出錯誤:

無法將類型'recordHistory'隱式轉換為'int'

順便說一句:如果我將第二行替換為: testRecord.id = 85;則上面的方法可以完美地工作testRecord.id = 85; 例如。

因此,我嘗試將上述行更改為以下內容,但無濟於事:

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

有什么想法可以刪除所選記錄嗎?

感謝@ 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的新手,我相信一般的方法可以使您做得更好/更好/更好...我期待其他答案並從中學習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM