La migration de type Asp.net Core IFormFile échoue

Je souhaite append l'image à la class, mais la migration du kernel asp.net a échoué:

Message d'erreur:
La propriété Product.ImageFile est d'un type d'interface ( IFormFile ). S'il s'agit d'une propriété de navigation, configurez manuellement la relation pour cette propriété en la convertissant en un type d'entité mappé, sinon ignorez la propriété du model.

product.cs:

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

Et comment dois-je stocker les images?

Comme l'erreur l'indique, vous ne pouvez pas stocker une interface directement avec Entity Framework, vous devez donner un type d'implémentation réel.

Si vous déboguez et arrêtez dans votre controller, vous pouvez voir que le type réel que vous recevez est un Microsoft.AspNetCore.Http.Internal.FormFile donc si vous voulez l'save, vous devriez utiliser ce type à la place.

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

Mais de toute façon vous ne pouvez pas save cela directement dans votre database. La première raison est que datatables sont accessibles via un stream donné par une méthode de cet object, pas directement à partir d'une propriété. Entity Framework ne sait pas comment effectuer cela, il ne peut save que les valeurs des propriétés.

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

Maintenant, pourquoi voulez-vous save votre file directement dans votre database? Je vous suggère plutôt d'save le file quelque part sur votre disque dur et de garder son path dans votre database.

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

Votre model de produit contiendra une propriété

 public ssortingng FilePath {get; set;} 

Ensuite, vous devez définir votre propriété FilePath dans votre object Product avec votre variable filePath

 myProduct.FilePath = filePath; 

Si vous voulez vraiment stocker datatables directement dans votre database et non dans un file physique, je suggère que vous puissiez append les propriétés dont vous avez besoin dans votre model de Product au lieu d'save directement un FormFile .

 public class Product { public int Id { get; set; } [Required] public byte[] FileData { get; set; } public ssortingng FileName { get; set; } } //using variables of the previous code examples myProduct.FileData = data; myProduct.FileName = file.FileName;