[英]How to delete records from database correctly
当我试图从 wep api 中的数据库中删除记录时,发生错误“System.InvalidOperationException:已经有一个打开的 DataReader 与此连接关联,必须先关闭”。 方法体:
[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();
}
}
如果用户是管理员,逻辑是删除所有记录,如果不是,则只删除他自己的记录。 数据库结构:
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; }
}
显然问题出在另一个开放连接上,但我不知道如何正确实现此方法。
原因:您正在同时执行两个或多个查询。
解决方案:在查询后添加ToList()
。
var longUrlsToRemove = _dataContext.Urls.Where(x => x.UserCreatedBy == user).ToList()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.