我将.NET Core 2.1.1与Entity Framework Core 2.1.1结合使用,并且我具有以下实体:
using System;
using System.ComponentModel.DataAnnotations;
using System.IO;
namespace MyWebApp.Models
{
public class Certificate
{
[Key]
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime RequestedAt { get; set; }
public Stream FileStream { get; set; }
}
}
这代表一个Certificate对象,我计划使用最后一个属性在其中存储PDF文件的FileStream。但是,当我尝试使用EF Core的Package Manager控制台命令Add-Migration Foo
运行迁移时,或者当尝试使用内存数据库运行项目时,出现以下错误:
尝试添加角色时
实体类型“流”要求定义主键。
只有当实体中存在最后一个属性(FileStream)时,它才会发生,如果我删除它,它会很好地工作。我搜索了其他相关问题,其中大多数都指向以下两个问题:
[Key]
属性。我还尝试使用Fluent API定义主键:
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System.IO;
namespace MyWebbApp.Models
{
public class DbContext : IdentityDbContext<IdentityUser>
{
public DbSet<ActionValue> ActionValues { get; set; }
public DbSet<Certificate> Certificates { get; set; }
public DbSet<VisualIVR> VisualIVRs { get; set; }
public DbSet<SMSRequest> SMSRequests { get; set; }
public DbContext (DbContextOptions<VysContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Certificate>()
.HasKey(c => c.Id);
}
}
System.AggregateException
HResult=0x80131500
Message=One or more errors occurred.
Source=System.Private.CoreLib
StackTrace:
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at VysMiddleware.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) in H:/MyApp/Startup.cs:line 84
Inner Exception 1:
AggregateException: One or more errors occurred.
Inner Exception 2:
InvalidOperationException: The entity type 'Stream' requires a primary key to be defined.
似乎与Stream
类型的使用有关,但是我已经定义了主键。有什么建议吗?,非常感谢您的帮助。
答案 0 :(得分:1)
当前无法使用EF Core将文件流存储在数据库中。您有几种选择:
存储读取该文件流的结果,对于PDF文件,该结果将是byte[]
blob。通常建议不要将文件存储在数据库中。
将路径存储到数据库中的PDF文件。例如"Documents/Certificates/xxxx.pdf"
如果您不需要将PDF持久保存在数据库中,只需告诉EF忽略它即可。这可以通过向属性添加NotMapped
属性来完成:
public class Certificate
{
[Key]
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime RequestedAt { get; set; }
[NotMapped]
public Stream FileStream { get; set; }
}
或在Fluent API中:
builder.Entity<Certificate>()
.HasKey(c => c.Id)
.Ignore(c => c.FileStream);