[英]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類,並如下修改了我的Load
和Remove
方法:
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.