异步web api方法将文件存储在磁盘上,但额外将每个文件保存到数据库

本文关键字:文件 数据库 保存 方法 api web 存储 异步 磁盘 | 更新日期: 2023-09-27 18:03:33

我注意到,由于异步上传小部件的性质,我使用我的web api方法在多个线程上被调用,每个被上传的文件一个。我试图将此与保存所有文件到数据库相结合。我不知道它是如何工作的,现在确切地说,但在一切的最后,所有的照片记录都保存到数据库。问题是我不能为它们中的每一个设置正确的排序顺序,除了最后一个,它们的SortOrder都是1。

这是我的web api方法,它的行为非常奇怪:

[HttpPost("{id}/photos")]
public IActionResult SavePhotos(int id, IEnumerable<IFormFile> photos)
{
    if (photos != null)
    {
        var product = _unitOfWork.Products.GetProductWithPhotos(id);
        foreach (var photo in photos)
        {
            if (photo.Length > 0)
            {
                var productPhotosPath = Path.Combine(_environment.WebRootPath, _settings.ProductUploadPath, product.Name);
                string randomFileName = Path.GetRandomFileName();
                randomFileName = Path.ChangeExtension(randomFileName, Path.GetExtension(photo.FileName));
                using (var fileStream = new FileStream(Path.Combine(productPhotosPath, randomFileName), FileMode.Create))
                {
                    photo.CopyTo(fileStream);
                }
                int maxSortOrder = product.Photos.Any() ? product.Photos.Max(p => p.SortOrder) : 0;
                Photo photoToSave = new Photo()
                {
                    ProductId = product.Id,
                    OriginalImageName = photo.FileName,
                    SavedImageName = randomFileName,
                    SortOrder = maxSortOrder + 1
                };
                _unitOfWork.Photos.Add(photoToSave);
            }
        }
        _unitOfWork.Complete();
    }
    return new EmptyResult();
}

异步web api方法将文件存储在磁盘上,但额外将每个文件保存到数据库

当你进行5次async调用时,不存在3次调用同时命中的可能性吗?当这3次调用被命中时,数据库中没有任何照片使其排序顺序为1,其余2次调用在保存前3次调用后排序顺序为1,使其排序顺序为2。

如何保持一个创建的时间戳在数据库和排序它的时间戳?如果您需要排序顺序属性,那么使用一个未映射的属性,该属性将根据创建的时间戳分配。