简体   繁体   English

如何正确从数据库中删除记录

[英]How to delete records from database correctly

While I was trying to delete records from databse in wep api, occurred with error "System.InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first".当我试图从 wep api 中的数据库中删除记录时,发生错误“System.InvalidOperationException:已经有一个打开的 DataReader 与此连接关联,必须先关闭”。 Method body:方法体:

 [HttpDelete]
[Route("/DeleteUrls")]
public async Task<IActionResult> DeleteUrls(string userName)
{
    var user = _dataContext.Users.FirstOrDefault(x => x.UserName == userName);
    if (user==null)
    {
        return BadRequest("No user with such Username");
    }
    switch (user.IsAdmin)
    {
        case true:
            var longUrls2Remove =  _dataContext.Urls.AsQueryable();
            foreach (var item in longUrls2Remove)
            {
                var shortUrl2Remove = _dataContext.ShortedUrls.FirstOrDefault(x => x.Url == item);
                _dataContext.ShortedUrls.Remove(shortUrl2Remove);
                _dataContext.Urls.Remove(item);
            }
            await _dataContext.SaveChangesAsync();
            return Ok();
        
        case false:
            var longUrlsToRemove = _dataContext.Urls.Where(x => x.UserCreatedBy == user);
            foreach (var item in longUrlsToRemove)
            {
                var shortUrlToRemove = _dataContext.ShortedUrls.FirstOrDefault(x => x.Url == item);
                _dataContext.ShortedUrls.Remove(shortUrlToRemove);
                _dataContext.Urls.Remove(item);
                
                await _dataContext.SaveChangesAsync();
                return Ok();
            }

            return BadRequest();
    }
}

Logic is to delete all records if user is admin, and only his own if he isnt.如果用户是管理员,逻辑是删除所有记录,如果不是,则只删除他自己的记录。 Database structure:数据库结构:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public bool IsAdmin { get; set; }

    public List<Url> Urls { get; set; }
}

public class Url
{
    public int Id { get; set; }
    public string OriginalUrl { get; set; }
    public DateTime CreatedAt { get; set; }

    public int UserId { get; set; }
    public User UserCreatedBy { get; set; }
    
    public ShortUrl ShortUrl { get; set; }
    
}
public class ShortUrl
{
    public int Id { get; set; }
    public string ShortedUrl { get; set; }

    public int UrlId { get; set; }
    public Url Url { get; set; }
}

Obviously the problem is with another open connetion, but I dont get any idea how to implement this method correctly.显然问题出在另一个开放连接上,但我不知道如何正确实现此方法。

Reason: you are executing two or more queries at the same time.原因:您正在同时执行两个或多个查询。

Solution : add ToList() after query.解决方案:在查询后添加ToList()

var longUrlsToRemove = _dataContext.Urls.Where(x => x.UserCreatedBy == user).ToList()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM