Entity Framework Core:将上传的文件保存到连接表

我有一个新闻表和一个文件表,我想在其中保存与新闻相关的图像或 pdf。下面是我的模型和 Create 方法,我将发布的文件保存到连接表中。


但是我收到以下错误。这对我来说没有意义,因为 NewsFiles 不应该是我数据库中的对象。NewsFile 是一个表,而 NewsFiles 是虚拟集合。


处理请求时数据库操作失败。DbUpdateException: 更新条目时出错。有关详细信息,请参阅内部异常。SqlException: 无效的对象名称“NewsFiles”。ApplicationDbContext 有待处理的模型更改 在 Visual Studio 中,使用包管理器控制台为这些更改构建新的迁移并将它们应用到数据库:


PM> Add-Migration [migration name] PM> Update-Database 或者,您可以搭建新的迁移并从项目目录的命令提示符应用它:


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 }

            }

        };

  

九州编程
浏览 208回答 1
1回答

holdtom

默认情况下:EF Core 将为与属性同名的上下文类中的所有 DbSet 属性创建数据库表因此,您需要覆盖默认约定。我看到你的评论builder.Entity<NewsFile>().ToTable("NewsFile")不起作用。但我只是试了一下,它解决了这个问题。当我评论表的显式映射时,我得到了异常SqlException: Invalid object name 'NewsFiles',但它没有说明挂起的模型更改和迁移。因此,您不知何故在模型和数据库之间出现了不一致。正如您在评论中指出的,重建数据库可以提供帮助
打开App,查看更多内容
随时随地看视频慕课网APP