Entity Framework Core: сохранение загруженного файла в объединенную таблицу - PullRequest
0 голосов
/ 01 июня 2018

У меня есть таблица новостей, соединенная с таблицей файлов, в которую я хочу сохранить изображения или PDF-файлы, связанные с новостями.Ниже моя модель и метод Create, где я сохраняю опубликованный файл в объединенную таблицу.

Однако я получаю следующую ошибку.Это не имеет смысла для меня, потому что файлы новостей не должны быть объектом в моей базе данных.NewsFile - это таблица, а NewsFiles - это виртуальные коллекции.

Операция базы данных завершилась неудачно при обработке запроса.DbUpdateException: произошла ошибка при обновлении записей.Смотрите внутреннее исключение для деталей.SqlException: недопустимое имя объекта «NewsFiles».Существуют ожидаемые изменения модели для ApplicationDbContext. В Visual Studio используйте консоль диспетчера пакетов, чтобы создать новую миграцию для этих изменений и применить их к базе данных:

PM> Add-Migration [имя миграции] PM> Update-База данных В качестве альтернативы вы можете создать новую миграцию и применить ее из командной строки в каталоге вашего проекта:

миграция dotnet ef добавить [имя миграции] обновление базы данных dotnet ef

public class News
{
    [Key] public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<NewsFile> NewsFiles { get; set; }
}

public class File
{
    [Key] public int Id { get; set; }
    public string Filename { get; set; }
    public Byte[] Content { get; set; }
    public virtual ICollection<NewsFile> NewsFiles { get; set; }
}

public class NewsFile
{
    [Key] public int Id { get; set; }
    public int NewsId { get; set; }
    public News News { get; set; }
    public int FileId { get; set; }
    public File File { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<NewsFile>().HasIndex(nf => new { nf.NewsId, nf.FileId });
    builder.Entity<NewsFile>().HasOne(nf => nf.News).WithMany(n => n.NewsFiles).HasForeignKey(nf => nf.NewsId);
    builder.Entity<NewsFile>().HasOne(nf => nf.File).WithMany(c => c.NewsFiles).HasForeignKey(pc => pc.FileId);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(NewsViewModel model)
{
    if (ModelState.IsValid)
    {
        Byte[] file = null;
        using (var ms = new MemoryStream())
        {
            model.File.CopyTo(ms);
            file = ms.ToArray();
        }
        model.News.NewsFiles = new List<NewsFile>()
        {
            new NewsFile()
            {
                File = new Models.File() { Content = file, Filename = model.File.FileName }
            }
        };
        _dbContext.News.Add(model.News);
        await _dbContext.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(model);
}

1 Ответ

0 голосов
/ 02 июня 2018

По умолчанию :

EF Core создаст таблицы базы данных для всех свойств DbSet в классе контекста с тем же именем, что и у свойства

Таким образом, вам нужно переопределить соглашение по умолчанию.Я видел твой комментарий, что builder.Entity<NewsFile>().ToTable("NewsFile") не работает.Но я только что попробовал, и это решает проблему.

Когда я комментирую явное сопоставление с таблицей, я получаю исключение SqlException: Invalid object name 'NewsFiles', но оно ничего не говорит об ожидающих изменениях модели и миграциях.Таким образом, вы каким-то образом получили несоответствие между моделью и базой данных.Как вы отметили в комментарии, перестройка базы данных может помочь

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