如何解决Asp.Net Core中包含数据的多个图像保存
我正在尝试保存一条记录以及多张图像。 Order类具有Images,这是orderImage类的iCollection,我要在其中保存每条记录的图像。
public class Order
{
[Key]
public int Id { get; set; }
[Display(Name = "Invoice ID")]
public string InvoiceId { get; set; }
[Display(Name = "Delivery Date")]
public string DeliveryDate { get; set; }
[Display(Name = "Shipping Location")]
public int ShippingLocationId { get; set; }
[Display(Name = "Branch ID")]
public string BranchId { get; set; }
[Display(Name = "Product Name")]
public string ProductName { get; set; }
[Display(Name = "Product Color")]
public string ProductColor { get; set; }
[Display(Name = "Product Size")]
public string ProductSize { get; set; }
[Display(Name = "Quantity")]
public string Quantity { get; set; }
[Display(Name = "Status")]
public string OrderStatusId { get; set; }
[Display(Name = "Sales Consultant")]
public string SalesPersonId { get; set; }
[Display(Name = "Order Note")]
public string OrderNote { get; set; }
[Display(Name = "Delivery Note")]
public string DeliveryNote { get; set; }
public ICollection<OrderImage> Images { set; get; }
}
public class OrderImage
{
[Key]
public int Id { set; get; }
public string Name { set; get; }
public long Size { set; get; }
public string Type { set; get; }
public string Path { set; get; }
public int orderId { set; get; }
}
然后将图像保存在具有orderID的其他表中,以便可以识别。 控制器在下面。
[HttpPost]
public async Task<IActionResult> NewOrderAsync(Order _order,IFormFile[] _fileObj,OrderImage _orderImage)
{
if (_fileObj == null || _fileObj.Length == 0)
{
ViewData["NullImage"] = "Please select at least one Image";
}
foreach (IFormFile _image in _fileObj)
{
string _imageExtension = Path.GetExtension(_image.FileName);
if (_imageExtension == ".jpg" || _imageExtension == ".png" || _imageExtension == ".JPEG" || _imageExtension == ".webp")
{
var _imageFileName = _order.InvoiceId + "_" + _image.FileName;
var _imageSave = Path.Combine(_iWebHost.WebRootPath,"OrderImage");
var _stream = new FileStream(Path.Combine(_imageSave,_imageFileName),FileMode.Create);
await _image.CopyToAsync(_stream);
_orderImage.Name = _imageFileName;
_orderImage.Type = _imageExtension;
_orderImage.Path = _imageSave;
_orderImage.Size = _image.Length;
_orderImage.orderId = _order.Id;
await _context.OrderImage.AddAsync(_orderImage);
ViewData["Message"] = "Image is saved";
}
else
{
ViewData["Message"] = "Image is not saved";
}
}
_context.Add(_order);
await _context.SaveChangesAsync();
return RedirectToAction("Order");
}
我遇到的问题是,无论何时保存图像,我都能够保存订单记录和上载图片的最后一张图像。根据数据库,当涉及到OrderID为0时,我尝试调试。订单ID返回0。如果我的操作方法正确,我确实需要建议。对于order和orderImages,有两个表。
解决方法
使用导航属性。订单可以具有图像集合和/或图像可以具有对订单的引用。当使用“标识”键列设置实体(应作为标准)时,EF将没有要提供的PK值,除非您调用SaveChanges()。导航属性是允许EF将提供的FK推迟到保存整个对象图的关键。
作为一个简单的例子:
public class Order
{
[Key]
public int OrderId { get; set; }
// Other Order fields...
public virtual ICollection OrderImage Images { get; set; } = new List<OrderImage>();
}
public class OrderImage
{
[Key]
public int OrderImageId { get; set; }
[ForeignKey("Order")]
public int OrderId { get; set; }
public virtual Order Order { get; set; }
}
然后当您去填充新订单和图像时:
var order = new Order
{
// populate fields...
}
foreach (var file in files)
{
var orderImage = new OrderImage
{
// copy details from file...
Order = order
}
order.Images.Add(orderImage);
}
context.Orders.Add(order);
context.SaveChanges();
由于EF知道Order和OrderImages之间的导航属性关系,所以当您插入新的Order和一组Image时,EF将自动在图像上计算出FK OrderId,以确保先保存Order,并为其分配新的ID,然后将OrderId提供给图像。
我强烈建议您阅读EF中的导航属性,因为这些属性使EF不必担心写作和阅读中的FK关系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。