实体框架(EF)和.net 6 Blazor没有更新数据库



我需要帮助试图理解为什么我的Blazor(服务器端)组件在。net Core 6中删除实体时不更新我的数据库,请看看我的代码示例:(事先,感谢您的所有帮助!)

首先,我注入我的db上下文如下:

@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);

换句话说,我必须从客户列表和列表中删除它,也使工作加倍,在我看来,它完全失去了来自DB和数据库的列表之间的连接(或引用)。这是我第一次看到这样的东西,我错过了什么吗?我是否按照我应该做的方式使用EF ?我可以只是添加命令,使其工作,但我不认为是一个很好的做法,请帮助!

是的,那是因为这就是EF的工作方式。

客户端列表包含查询的元素。即使在删除之后,它仍然是一个查询元素。Ef没有逻辑上的方法来更新客户端——特别是客户端是一个列表,没有相应的API。

所以,你必须把它从两者中删除,这是合乎逻辑的。

实际上你完全错了。从客户端删除某些内容不会触发Ef中的任何内容,因为启动它没有意义。我可以删除它们,然后在上面运行代码-并会触发从数据库中自动删除,只是为了过滤掉UI中的一些东西。只有db。Remove实际上告诉Ef它是从数据库中删除它。这不是双重的,这不是神奇地读懂你的思想。

您必须从dbcontext中删除item,而不是从列表中删除item。创建视图之后,所有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(); 

并获得更新的客户列表。

最新更新