Asp.Net Core中包含数据的多个图像保存

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res