【问题标题】:Multiple Image Save with data in Asp.Net Core使用 Asp.Net Core 中的数据保存多个图像
【发布时间】:2020-08-31 14:28:02
【问题描述】:

我正在尝试将记录与多张图像一起保存。 Order 类有图像,它是 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 有两个表。

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-core


    【解决方案1】:

    利用导航属性。订单可以有一组图像和/或图像可以有一个订单的引用。当实体设置有标识键列(这应该是规范)时,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 知道 Orders 和 OrderImages 之间的导航属性关系,当您插入新的 Order 和一组图像时,EF 会自动计算出图像上的 FK OrderId,以确保先保存 Order,并分配一个新的ID,然后将该 OrderId 提供给图像。

    我强烈建议阅读 EF 中的导航属性,因为这些属性允许 EF 接管担心读写的 FK 关系。

    【讨论】:

    • 好的,这很好。很有帮助,非常感谢。现在,如果我想将图像检索到订单表,会怎样?我必须显示我们在订单数据行中插入的集合中的一张图像,我已添加为: 在表格视图中。我看不到图像,错误是:控制台上的 404,localhost:44310/OrderImage/…
    • 请查看此问题以获取更多信息stackoverflow.com/questions/63751252/…
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2021-04-26
    • 2020-02-11
    • 2019-02-26
    相关资源
    最近更新 更多