需要帮助来创建创建控制器以从数据库中删除项目

时间:2018-07-26 21:40:28

标签: entity-framework model-view-controller asp.net-core

大家晚上好!我一直在跟着一个教程学习如何在.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");
    }

1 个答案:

答案 0 :(得分:0)

问题是由于where方法造成的!它返回一个集合,并且EF的Remove方法不会因为它带有一个对象而抱怨它。尝试使用FirstOrDefaultSingleOrDefaultFind方法进行更改,您会很方便。

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