.Net Core API с EF Core Code First и IdentityUser

У меня есть существующее приложение, которое я переписываю как .NET Core API с внешним интерфейсом ReactJS. Я все еще в конце API, и у меня возникла проблема.

КОД

У меня есть класс сущности BbUser.cs со следующим кодом:

public class BbUser : IdentityUser
{
  public int Points { get; set; } = 0;
  public string DisplayUsername { get; set; }
}

И у меня также есть класс сущности Artist.cs:

public class Artist
{
  public int Id { get; set; }
  [Required]
  [MaxLength(50)]
  public string FirstName { get; set; }
  [MaxLength(50)]
  public string LastName { get; set; }
  [MaxLength(100)]
  public string UrlFriendly { get; set; }
  public string ImageUrl { get; set; }
  public bool IsVerified { get; set; }
  public DateTime CreatedOn { get; set; }
  public DateTime ModifiedOn { get; set; }
  public ICollection<Lyric> Lyrics { get; set; } = new List<Lyric>();
  public string UserId { get; set; }
  public BbUser User { get; set; }
}

Мне нужна связь "один ко многим" между BbUser и Artist. Один пользователь может представить множество исполнителей и текстов песен... и т.д. Простые вещи на самом деле.

ПРОБЛЕМА

Приложение строится нормально, но когда я пытаюсь запустить его, нажав на контроллер, которому требуется доступ к базе данных, я получаю следующую ошибку:

Тип сущности «IdentityUserLogin» требует определения первичного ключа.

У меня были эти проблемы с обычным EF Code First (не Core), и исправление для этого здесь не работает.


person J86    schedule 08.08.2017    source источник


Ответы (2)


Эта модель работала для меня (скомпилированная и без исключений во время выполнения), если я использовал следующий код в классе DbContext:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<BbUser>(b => b.ToTable("AspNetUsers"));
        base.OnModelCreating(builder);
    }

Без вызова base.OnModelCreating(builder) я получаю ту же ошибку, потому что в этом случае контекст не применяет схему, связанную с идентификацией.

ОБНОВЛЕНИЕ: у меня все работает нормально, как видно из снимка экрана ниже: введите здесь описание изображения

У меня есть еще одна идея, почему у вас может быть такая ошибка. Ваш BbContext унаследован от класса DbContext или IdentityDbContext<IdentityUser>? Потому что я получил ту же ошибку, что и на вашем скриншоте, если бы я использовал обычный класс DbContext.

Чтобы таблицы Identity работали нормально, вы должны использовать IdentityDbContext<IdentityUser>. Ниже весь код моего рабочего класса DbContext

 public class BbContext :IdentityDbContext<IdentityUser>
    {
        public BbContext(DbContextOptions options):base(options)
        {
            Database.EnsureCreated();
        }

        public DbSet<Artist> Artists { get; set; }
        public DbSet<Lyric> Lyrics { get; set; }
        public DbSet<Heart> Hearts { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<BbUser>(b => b.ToTable("AspNetUsers"));
            builder.Entity<Heart>().HasKey(h => new {h.UserId, h.LyricId});
            base.OnModelCreating(builder);
        }
    }
person user2771704    schedule 08.08.2017
comment
Я просто пошел дальше и попробовал то, что вы предложили. К сожалению, я получаю ту же ошибку. - person J86; 08.08.2017
comment
@Ciwan Странно, можете ли вы показать запрос LINQ, который генерирует такую ​​​​ошибку? - person user2771704; 09.08.2017
comment
У меня нет запроса LINQ как такового. Я просто хочу проверить, создается ли моя БД, поэтому я создал DummyController, передавая в моем контексте через конструктор. Это должно заставить EF Core создать мою базу данных, и, как вы видите, эта ошибка мешает этому. - person J86; 09.08.2017
comment
@Ciwan Я вижу, пожалуйста, проверьте мой обновленный ответ, он отлично сработал для меня, используя его решение. - person user2771704; 09.08.2017
comment
Я использовал DbContext. Я изменил это на IdentityDbContext<IdentityUser>, и теперь все работает нормально. Большое спасибо. - person J86; 09.08.2017

Пожалуйста, попробуйте объявить свойство Guid с именем Id с помощью Get и Set для сущности IdentityUserLogin.

Другой вариант — объявить свойство и украсить его атрибутом [Key].

person Leonardo    schedule 08.08.2017