大家晚上好!我一直在跟着一个教程学习如何在.NET中编程。本教程介绍了如何添加项目,但不涉及删除。这是我的代码:
服务层
public async Task Delete(int locationId)
{
var location = _context.Locations.Where(l => l.Id == locationId);
_context.Remove(location);
await _context.SaveChangesAsync();
}
控制器
public IActionResult Delete(int id)
{
_locationService.Delete(id);
return RedirectToAction("Index", "Location");
}
查看
<table class="table table-hover" id="locationIndexTable">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
<th>Phone Number</th>
<th>Delete Location</th>
</tr>
</thead>
<tbody>
@foreach (var location in Model.LocationList)
{
<tr>
<td>
<a asp-controller="Location" asp-action="Detail" asp-route-id="@location.Id">
@location.Name
</a>
</td>
<td>
@location.Address
</td>
<td>
@location.PhoneNumber
</td>
<td>
<a asp-controller="Location" asp-action="Delete" asp-route-id="@location.Id" class="btn btn-sm btn-primary">TODO Delete</a>
</td>
</tr>
}
</tbody>
我的按钮单击并重定向回到我的位置索引视图。但是,它不会按预期从数据库中删除该位置。我知道问题必须出在控制器上。
这很有可能会在将来对某人有所帮助,这就是我更改代码以使其正常工作的原因: 服务层
public async Task Delete(int locationId)
{
var location = _context.Locations.SingleOrDefault(l => l.Id == locationId);
_context.Remove(location);
await _context.SaveChangesAsync();
}
控制器
public async Task <IActionResult> Delete(int id)
{
await _locationService.Delete(id);
return RedirectToAction("Index", "Location");
}
答案 0 :(得分:0)
问题是由于where
方法造成的!它返回一个集合,并且EF的Remove
方法不会因为它带有一个对象而抱怨它。尝试使用FirstOrDefault
或SingleOrDefault
或Find
方法进行更改,您会很方便。
public async Task Delete(int locationId)
{
var location = _context.Locations.FirstOrDefault(l => l.Id == locationId);
_context.Remove(location);
await _context.SaveChangesAsync();
}
但是,如果您尝试使用Generic
版本,则肯定会立即发现问题。更好的方法是:
//EF Core
var item = await dbContext.FindAsync<Location>(locationId);
dbContext.Remove<Location>(item);
await dbContext.SaveChangesAsync();