'HttpPostedFileBase' 没有定义键

'HttpPostedFileBase' has no key defined

我有一个网络应用程序可以将图像上传到数据库并检索它们。

public class ImageGallery
{
    [Key]
    public int ImageID { get; set; }
    public int ImageSize { get; set; }
    public string FileName { get; set; }
    public byte[] ImageData { get; set; }
    [Required(ErrorMessage="Please select Image File")]
    public HttpPostedFileBase file { get; set; }
}

我的数据库上下文 class 是这样的

public class MyDatabaseEntities : DbContext
{
    public DbSet<ImageGallery> ImageGalleries { get; set; }
}

这是我的控制器

public ActionResult Upload()
{
    return View();
}
[HttpPost]
public ActionResult Upload(ImageGallery IG)
{
    IG.FileName = IG.File.FileName;
    IG.ImageSize = IG.File.ContentLength;
    byte[] data = new byte[IG.File.ContentLength];
    IG.File.InputStream.Read(data, 0, IG.File.ContentLength);
    IG.ImageData = data;
    using(MyDatabaseEntities dc = new MyDatabaseEntities())
    {
        dc.ImageGalleries.Add(IG);
        dc.SaveChanges();
    }
    return RedirectToAction("Gallery");
}

现在当我尝试上传图片时出现以下错误

EntityType 'HttpPostedFileBase' has no key defined. Define the key for this EntityType. HttpPostedFileBases: EntityType: EntitySet 'HttpPostedFileBases' is based on type 'HttpPostedFileBase' that has no keys defined.

我看到了一个关于堆栈溢出的问题-----。我尝试了解决方案,但没有取得任何成功。

我关注这个博客就是为了这个目的------ http://dotnetawesome.com/mvc/how-to-upload-image-to-database-and-show-in-view-without-image-handler

您不能将 HttpPostedFileBase 存储在数据库字段中(它是一个包含多个属性的复杂对象)。您可以使用 [NotMapped] 属性排除它,但是您的模型和视图确实没有任何关系(您不包括模型其他属性的任何输入)。

相反,您的视图可以只是

@using (Html.BeginForm("Upload", "ImageGallery", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="file" />
    <input type = "submit" value="Upload" />
}

并将 POST 方法更改为

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file.ContentLength > 0) // check a file was selected
    {
       // Initialize a new instance of the data model and set its properties
       ImageGallery model = new ImageGallery()
       {
           FileName = file.FileName,
           ImageSize = file.ContentLength,
           ....
       };
       .... // save and redirect
    }
    else {
      // add a model state error and return the view?
    }
}

只需尝试一个具有类似属性的新视图模型-----

    public class ImageViewModel
   {
    public int ImageID { get; set; }
    public int ImageSize { get; set; }
    public string FileName { get; set; }
    public byte[] ImageData { get; set; }
    public HttpPostedFileBase File { get; set; }
   }

并像这样更改您的控制器-----

    public ActionResult Upload(HttpPostedFileBase file)
    {
        ImageGallery IG = new ImageGallery();
    IG.FileName = file.FileName;
      IG.ImageSize = file.ContentLength;

        byte[] data = new byte[file.ContentLength];
        file.InputStream.Read(data, 0, file.ContentLength);

           IG.ImageData = data;

        var model = new ImageViewModel
        {
            FileName = file.FileName,
            ImageSize = file.ContentLength,
            ImageData = data,
            File = file
        };


        using(MyDatabaseEntities dc = new MyDatabaseEntities())
        {
            dc.ImageGalleries.Add(IG);
            dc.SaveChanges();
        }
        return View(model);

    }

}

}

并像这样更改您的视图页面------

    @model Image.Models.ImageViewModel

<h2>Upload</h2>
 @using (Html.BeginForm("Upload", "ImageGallery", FormMethod.Post, new { enctype = "multipart/form-data" }))
 {
  @Html.ValidationSummary(true)
  <table>
    <tr>
        <td>Select File : </td>
        <td>
            @Html.TextBoxFor(Model => Model.File, new { type = "file" })
            @Html.ValidationMessage("CustomError")
        </td>
       <td>
            <input type="submit" value="Upload" />
        </td>
    </tr>
</table>
 }

试试这个

[NotMapped]
public HttpPostedFileBase File { get; set; }

这不会映射到数据库。

发生错误是因为它们在您的 table

中没有数据类型 HttpPostedFileBase