Asp.net Сбой миграции типа Core IFormFile

#c# #asp.net #sql-server #asp.net-core

#c# #asp.net #sql-сервер #asp.net-core

Вопрос:

Я хочу добавить изображение в класс, но asp.net Сбой миграции ядра:

сообщение об ошибке:
Свойство Product.ImageFile имеет тип интерфейса ( IFormFile ). Если это свойство навигации, вручную настройте связь для этого свойства, приведя его к сопоставленному типу объекта, в противном случае игнорируйте свойство из модели.

product.cs:

 [Required]
[DataType(DataType.Upload)]
[FileExtensions(Extensions = "jpg,png,jpeg,bmp")]
public IFormFile ImageFile { set; get; }
  

И как я должен хранить изображения?

Комментарии:

1. Голосуем за то, что не предоставили доказательства для голосования против. Голосование без надлежащего объяснения не является конструктивным.

Ответ №1:

Как указано в ошибке, вы не можете сохранить интерфейс напрямую с Entity Framework, вы должны указать фактический тип реализации.

Если вы выполняете отладку и останавливаетесь в своем контроллере, вы можете увидеть, что фактический тип, который вы получаете, является Microsoft.AspNetCore.Http.Internal.FormFile , поэтому, если вы хотите сохранить его, вам следует использовать этот тип вместо.

 using Microsoft.AspNetCore.Http.Internal;
[....]
[....]
public FormFile ImageFile { set; get; }
  

Но в любом случае вы не можете сохранить это непосредственно в своей базе данных. Первая причина заключается в том, что данные доступны через поток, заданный методом этого объекта, а не напрямую из свойства. Entity Framework не знает, как это выполнить, он может только сохранять значения свойств.

 byte[] data;
using (var stream = file.OpenReadStream())
{
    data = new byte[stream.Length];
    stream.Read(data, 0, (int)stream.Length);
}
  

Теперь, почему вы хотите сохранить свой файл непосредственно в своей базе данных? Я предлагаю вам вместо этого сохранить файл где-нибудь на вашем жестком диске и сохранить его путь в вашей базе данных.

 var filePath = myPhisicalOrRelativePath   "/"   file.FileName; //Be careful with duplicate file names
using (var fileStream = System.IO.File.Create(filePath))
{
    await file.CopyToAsync(fileStream);
}
  

Ваша модель продукта будет содержать свойство

 public string FilePath {get; set;}
  

Затем вам нужно установить свое свойство FilePath в вашем Product объекте с помощью вашей filePath переменной

 myProduct.FilePath = filePath;
  

Если вы действительно хотите сохранить данные непосредственно в своей базе данных, а не в виде физического файла, я предлагаю вам добавить необходимые свойства в свою Product модель вместо того, чтобы сохранять FormFile напрямую.

 public class Product
{
    public int Id { get; set; }

    [Required]
    public byte[] FileData { get; set; }

    public string FileName { get; set; }
}

//using variables of the previous code examples
myProduct.FileData = data;
myProduct.FileName = file.FileName;