【问题标题】:Need help creating Creating Controller to Delete item from database需要帮助创建创建控制器以从数据库中删除项目
【发布时间】:2019-01-03 23:37:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    问题在于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();
    

    【讨论】:

    • 感谢您的帮助!我进行了您建议的更改,但是,它仍然没有删除 w 项目,并且我没有收到错误,只是删除后预期的重定向。
    • 我刚刚想出了如何让我的代码工作,我在没有你的代码的情况下尝试了它,然后将我的更新与你的结合起来,现在它正在按预期删除!我将把我的解决方案粘贴到顶部,因为我不知道如何在此处使用格式进行评论
    • @Transcendent 我很好奇,为什么通用版本更好?因为 Remove 方法采用显式类型?
    • @CoreyBryant:y 推荐的解决方案可能对您不起作用的原因是,位置的 id 必须是主键。所以我猜你的情况不是PK。
    • @ArnovanBoven:简而言之,当您知道要处理的类型时,泛型的工作速度比在 C# 中强制转换对象或确定其类型要快。在 Java 中,这是另一回事,因为泛型一直被视为对象。
    猜你喜欢
    • 2010-11-23
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2013-12-08
    • 1970-01-01
    • 2020-03-06
    • 2010-11-08
    相关资源
    最近更新 更多