在 Entity Framework 中使用文件系统上传图库图片

Uploading gallery images using filesystem in Entity Framework

我想使用文件系统上传将图库图像上传到 ASP.NET MVC 5 应用程序。我添加了

public IEnumerable<string> GalleryImages { get; set; } 

到我的 ProductModel,构建解决方案并在程序包管理器控制台中执行 update-database。但是,属性 没有添加到 Product table 中,当我尝试添加然后编辑产品时,出现此错误:

System.ArgumentNullException: 'Value cannot be null. Parameter name: source'

此外,我将这段代码添加到Edit.cshtl:

@if (!Model.GalleryImages.Any())
{
    <h4>There are no gallery images for this product.</h4>
}

<form action="/AdminPanel/Product/SaveGalleryImages" method="post" enctype="multipart/form-data" class="dropzone" id="dropzoneForm">
    <div class="fallback">
        <input type="file" name="file" multiple />
        <input type="submit" value="Upload" />
    </div>
</form>

<br /><br />

@foreach (var image in Model.GalleryImages)
{
    <div style="display: inline-block">
        <img src="/Images/Uploads/Products/@Model.Id/Gallery/Thumbs/@image" />
        @Html.ActionLink("delete", "DeleteImage", "Product", new { @class = "deleteimage", data_name = image })
    </div>
}
<link href="~/Scripts/dropzone/basic.css" rel="stylesheet" />
<link href="~/Scripts/dropzone/dropzone.css" rel="stylesheet" />

@section Scripts{
    <script src="~/Scripts/dropzone/dropzone.js"></script>

    <script>
    $(function () {
        //preview image
        function readURL(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $("img#imgpreview").attr("src", e.target.result).width(200).height(200);
                }
                reader.readAsDataURL(input.files[0]);
            }
        }
        $("#ImageUpload").change(function () {
            readURL(this);
        });

        //dropzone js

        Dropzone.options.dropzoneForm = {
            acceptedFiles: "image/*",
            init: function () {
                this.on("complete", function (file) {
                    if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
                        location.reload();
                    }
                });

                this.on("sending", function (file, xhr, formData) {
                    formData.append("id", @Model.Id);
                });
            }
        };

        //dropzone js
        $("a.deleteimage").click(function (e) {
            e.preventDefault();

            if (!confirm("confirm deletion"))
                return false;

            var $this = $(this);
            var url = "/admin/shop/DeleteImage";
            var imageName = $this.data("name");

            $.post(url, { id: @Model.Id, imageName: imageName }, function (data) {
                $this.parent().fadeOut("fast");
            });
        });
    });
    </script>
}

更新:

当您将列数据类型建模为 List<string> 时,您究竟希望列数据类型是什么? SQL 服务器没有任何列数据类型来处理任意字符串列表....

如果您在 ProductModel 和图库图像之间存在 1:n 关系,那么您确实应该有一个 separate 模型 class图像信息 - 例如MyImages。然后你可以添加一个集合样式 属性

public virtual ICollection<MyImages> GalleryImages 

你的 ProductModel class。

SQL 服务器无法真正处理 List<string> 作为列类型.....


完成此操作所需的步骤是:

  1. 更改您的 C# 模型class(您已经这样做了)
  2. 运行 add-migration migration-name 以便将 EF 迁移添加到您的项目中(您似乎跳过了这一步)
  3. 运行 update-database 实际将该迁移应用到数据库。

只有当您完全按照此顺序完成 所有 3 个步骤 时,您的 C# 模型 class 的更改才会实际应用于数据库 - 您 CANNOT 只需跳过步骤 #2 ....