#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;