实体类型“流”要求定义主键。 .Net Core 2.1

时间:2018-08-27 21:05:53

标签: c# entity-framework asp.net-core asp.net-core-2.1 ef-core-2.1

我将.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)时,它才会发生,如果我删除它,它会很好地工作。我搜索了其他相关问题,其中大多数都指向以下两个问题:

  • 由于命名约定,EF无法识别主键。
  • 必须使用Fluent API明确定义组合键。
  • 只需在主键属性之前放置一个[Key]属性。

我还尝试使用Fluent API定义主键:

这是我的DbContext:

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类型的使用有关,但是我已经定义了主键。有什么建议吗?,非常感谢您的帮助。

1 个答案:

答案 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);