Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心:将上载的文件保存到联接表_C#_Entity Framework Core - Fatal编程技术网

C# 实体框架核心:将上载的文件保存到联接表

C# 实体框架核心:将上载的文件保存到联接表,c#,entity-framework-core,C#,Entity Framework Core,我有一个与文件表连接的新闻表,我想在其中保存与新闻相关的图像或PDF。下面是我的模型和创建方法,我将在其中将发布的文件保存到联接表中 但是,我得到了以下错误。这对我来说没有意义,因为新闻文件不应该是我数据库中的对象。新闻文件是一个表,新闻文件是虚拟集合 处理请求时数据库操作失败。 DbUpdateException:更新条目时出错。看见 详细信息的内部异常。SqlException:对象名称无效 “新闻文件”。ApplicationDbContext存在挂起的模型更改 在VisualStudio

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

但是,我得到了以下错误。这对我来说没有意义,因为新闻文件不应该是我数据库中的对象。新闻文件是一个表,新闻文件是虚拟集合

处理请求时数据库操作失败。 DbUpdateException:更新条目时出错。看见 详细信息的内部异常。SqlException:对象名称无效 “新闻文件”。ApplicationDbContext存在挂起的模型更改 在VisualStudio中,使用包管理器控制台构建新的 迁移这些更改并将其应用于数据库:

PM>添加迁移[迁移名称]PM>或者更新数据库, 您可以在以下位置构建新迁移并从命令提示符应用它: 您的项目目录:

dotnet ef迁移添加[迁移名称] dotnet ef数据库更新

公共类新闻
{
[Key]public int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection新闻文件{get;set;}
}
公共类文件
{
[Key]public int Id{get;set;}
公共字符串文件名{get;set;}
公共字节[]内容{get;set;}
公共虚拟ICollection新闻文件{get;set;}
}
公共类新闻文件
{
[Key]public int Id{get;set;}
public int NewsId{get;set;}
公共新闻{get;set;}
public int FileId{get;set;}
公共文件{get;set;}
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity().HasIndex(nf=>new{nf.NewsId,nf.FileId});
builder.Entity().HasOne(nf=>nf.News).WithMany(n=>n.NewsFiles).HasForeignKey(nf=>nf.NewsId);
builder.Entity().HasOne(nf=>nf.File).WithMany(c=>c.NewsFiles).HasForeignKey(pc=>pc.FileId);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(NewsViewModel模型)
{
if(ModelState.IsValid)
{
字节[]文件=null;
使用(var ms=new MemoryStream())
{
model.File.CopyTo(ms);
file=ms.ToArray();
}
model.News.NewsFiles=新列表()
{
新建新闻文件()
{
File=new Models.File(){Content=File,Filename=model.File.Filename}
}
};
_dbContext.News.Add(model.News);
wait_dbContext.saveChangesSync();
返回操作(“索引”);
}
返回视图(模型);
}

EF Core将为与属性同名的上下文类中的所有DbSet属性创建数据库表

因此,您需要覆盖默认约定。我看到你的评论说
builder.Entity().ToTable(“新闻文件”)
不起作用。但我只是尝试了一下,它解决了问题


当我对表的显式映射进行注释时,得到了异常
SqlException:Invalid object name'NewsFiles'
,但它没有说明挂起的模型更改和迁移。因此,您不知何故得到了模型和数据库之间的不一致性。正如您在评论中所指出的,重建数据库有助于

新闻文件是否作为表存在于数据库中?是的,新闻文件是我的数据库中的表。错误表示NewsFiles是无效的对象名称。我甚至试着指定表名,比如builder.Entity().ToTable(“新闻文件”),我删除了数据库,让它重新构建,现在一切都正常了。我猜有点奇怪。根据您的评论,改进了答案:)
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);
}