Как сохранить свойство типа IFormFile в таблицах пользователей в asp.net core 2? - PullRequest
0 голосов
/ 12 мая 2018

После регистрации пользователя в asp.net core 2.0 MVC я хочу иметь возможность загрузить файл PDF и сохранить его имя или идентификатор в строке этого пользователя, чтобы я мог загрузить его позже. Я сделал все, но я получаю эту ошибку:

The property 'ApplicationUser.contract' is of an interface type ('IFormFile'). If it is a navigation property manually configure the relationship for this property by casting it to a mapped entity type

Я не понимаю, что означает "приведение к отображенному типу сущности", я что-то упустил? Вот мой метод:

Сначала загружаем файл:

   var path = Path.Combine(Directory.GetCurrentDirectory(), "Uploads",model.FileToUpload.GetFilename());


        using (var stream = new FileStream(path, FileMode.Create))
        {
            await model.FileToUpload.CopyToAsync(stream);
        }

затем, добавив его в свойство пользователя var user = new ApplicationUser { UserName = model.username, Email = model.Email, contract = model.FileToUpload };

Пользователь приложения имеет это в модели: public IFormFile contract {get; set;} и у модели viewview есть это: public IFormFile FileToUpload { get; set; }

любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Чтобы добавить ответ Невилла, я бы предложил вам создать ApplicationUserViewModel, чтобы вы могли отделить внешнюю логику и ввод / проверку от домена модели, который вы используете для своей БД, в частности, в ApplicationUserViewModel вы приобретаете файловый контракт как IFormFile, а в прежнем ApplicationUser классе создаете свойство со следующим идентификатором:

public class ApplicationUser : ...
{
    //... other properties
    [ForeignKey("Contracts")]
    public string ContractId { get; set; }
}

и создаете другой класс модели домена, например Contracts как:

public class Contracts
{
    public Guid Id { get; set; }
    public byte[] FileBlob { get; set; }
    public string FileExtension { get; set; }
}

так что в вашем фактическом ApplicationUser вы не сохраняете весь файловый BLOB-объект, но имеете ссылку на него, что приводит к большей производительности, чем необходимость загружать BLOB-объект каждый раз, когда вы копируете ApplicationUser.

0 голосов
/ 12 мая 2018

Ваше сообщение об ошибке исходит от Entity Framework.Подробнее об этом можно прочитать здесь: https://docs.microsoft.com/en-us/ef/core/modeling/relationships

Короче говоря, ApplicationUser назначается как сущность в рамках DbContext в рамках сущности.EF Core обычно пытается сопоставить каждое свойство класса сущности со значением в базе данных.EF Core не может напрямую сопоставить IFormFile с типом данных, чтобы создать столбец в вашей базе данных (в вашем случае это также не требуется).

Итак, вашим первым шагом было бы сказать EF Core "не беспокойтесь об этом свойстве".Это можно сделать, добавив аннотацию NotMapped поверх вашего свойства IFormFile.Следующим шагом является сохранение имени вашего файла в вашей базе данных для справки.Я заметил, что вы используете имя загруженного файла для этого.Чтобы избежать конфликтов имен, вы можете использовать что-то вроде Guid.NewGuid().ToString() для генерации уникальной строки (не забудьте добавить свое расширение).Чтобы сохранить это имя файла в вашей базе данных, вам нужно создать строковое свойство в вашем классе ApplicationUser и сохранить только имя файла .Сам файл не должен входить в объект user.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...