异步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();
}
当你进行5次async调用时,不存在3次调用同时命中的可能性吗?当这3次调用被命中时,数据库中没有任何照片使其排序顺序为1,其余2次调用在保存前3次调用后排序顺序为1,使其排序顺序为2。
如何保持一个创建的时间戳在数据库和排序它的时间戳?如果您需要排序顺序属性,那么使用一个未映射的属性,该属性将根据创建的时间戳分配。