我需要幫助試圖了解為什么我的 .net Core 6 中的 Blazor(服務器端)組件在洗掉物體時沒有更新我的資料庫,請查看我的代碼示例:(事先,感謝您的所有幫助!)
首先,我按如下方式注入我的資料庫背景關系:
@inject AppDbContext db
然后,在我的代碼下面,我決定查詢一些資料,在這種情況下,客戶如下:
@code {
private List<Customer> clients { get; set; }
protected override async Task OnInitializedAsync()
{
clients = await db.Customers.ToListAsync();
}
}
現在,我創建了一個帶有洗掉客戶方法的按鈕;首先我搜索物體,如果找到,然后我從資料庫中的“客戶”串列中洗掉該專案,如下所示:
private async Task DeleteCustomer(int CustomerId)
{
Customer? customer = clients.FirstOrDefault(f => f.Id == CustomerId);
if (customer is not null)
{
clients.Remove(customer);
await db.SaveChangesAsync();
}
}
問題是物體從串列中洗掉但沒有從資料庫中洗掉,所以當我重繪 仍然存在的專案時,我必須在 if 中應用另一個命令以使其作業:
db.Remove(customer);
換句話說,我必須將它從客戶串列和串列中洗掉,使作業加倍,在我看來它完全失去了來自資料庫和資料庫的串列之間的連接(或參考)。這是我第一次看到這樣的東西,我錯過了什么嗎?我是否按照我應該做的方式使用 EF?我可以添加該命令并使其作業,但我認為這不是一個好習慣,請幫助!
uj5u.com熱心網友回復:
是的,那是因為這就是 EF 的作業方式。
客戶端串列包含查詢的元素。即使洗掉后,它仍然是一個查詢元素。Ef 沒有合乎邏輯的方法來更新客戶端 - 特別是因為客戶端是一個串列,它沒有以明智的方式為此提供 API。
因此,您必須將其從兩者中洗掉,這是合乎邏輯的。
其實你完全錯了。從客戶端洗掉某些內容不會從 Ef 觸發任何內容,因為開始沒有任何意義。我可以將它們洗掉然后在上面運行代碼 - 并且會觸發從資料庫中自動洗掉只是為了在 UI 中過濾掉一些東西。只有 db.Remove 實際上告訴 Ef 它是從資料庫中洗掉它。這不是雙重的,是 Ef 沒有神奇地讀懂你的思想。
uj5u.com熱心網友回復:
您必須從 dbcontext 中洗掉專案,而不是從串列中洗掉。創建視圖后,所有 dbcontext 都已處理,串列未連接。當您嘗試洗掉時,您已經擁有不同的資料庫背景關系。所以你需要這個
public async Task DeleteCustomer(int CustomerId)
{
var customer = await db.Customers.FirstOrDefaultAsync(f => f.Id == CustomerId);
if (customer!=null)
{
db.Customers.Remove(customer);
var result= await db.SaveChangesAsync();
// you can add if it makes a difference
if(result==1) clients.Remove(customer);
}
}
洗掉后你可以打電話
clients = await db.Customers.ToListAsync();
再次獲取更新的客戶串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335853.html
