Тип сущности «поток» требует определения первичного ключа. .Net Core 2.1 - PullRequest
0 голосов
/ 28 августа 2018

Я использую .NET Core 2.1.1 с Entity Framework Core 2.1.1, и у меня есть следующий Entity:

Некоторая сущность

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, где я планирую хранить FileStream файла PDF, используя, конечно, последнее свойство. Но когда я пытаюсь выполнить миграцию, используя консольную команду диспетчера пакетов EF Core 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 голосов
/ 28 августа 2018

Вы не можете сохранить файл stream в вашей базе данных в настоящее время с EF Core. У вас есть несколько вариантов:

  • Сохраните результат чтения этого потока файла, который в случае файла PDF будет byte[] большим двоичным объектом. Обычно рекомендуется не хранить файлы в базе данных.

  • Сохраните путь к файлу 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; }
    }
    

    или в свободном API:

    builder.Entity<Certificate>()
        .HasKey(c => c.Id)
        .Ignore(c => c.FileStream);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...