.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 клас.

За да работят добре таблиците за идентичност, трябва да използвате 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 Strange, можеш ли да покажеш LINQ заявката, която генерира такава грешка? - person user2771704; 09.08.2017
comment
Нямам LINQ заявка като такава. Просто искам да тествам, за да се уверя, че моята Db ще бъде създадена, затова създадох преминаване на 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