2017-08-08 155 views
0

我有一个existing application,我正在重写为带有ReactJS前端的.NET Core API。我仍然在API的最后,我遇到了一个问题。.Net核心API与EF核心代码第一和IdentityUser

CODE

我有下面的代码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; } 
} 

我需要一个单BbUserArtist之间的一对多关系。一位用户可以提交许多艺术家和歌词......等等。简单的东西真的。

问题

应用程序建立很好,但是当我试图通过打需要访问数据库中的一个控制器来运行它,我得到以下错误:

The entity type 'IdentityUserLogin' requires a primary key to be defined.

我有这个问题与常规EF代码优先(而不是核心)和the fix for that,不起作用。

回答

1

这种模式为我工作(编制,并在运行时也不例外),如果我用下面的代码中的DbContext类:

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

如果不调用base.OnModelCreating(builder),我得到了同样的错误,因为在这种情况下,背景ISN不应用身份相关模式。

UPDATE: 一切工作正常,我因为你可以看到下面的截图: enter image description here

我还有一个想法,为什么你能有这样的错误。您的BbContext继承了DbContext类还是IdentityDbContext<IdentityUser>?因为如果我使用通常的DbContext类,我得到了与截图相同的错误。

为了使Idenity表正常工作,您应该使用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); 
     } 
    } 
+0

我只是说干就干,[试过你的建议(https://www.screencast.com/t/xnwgQlAt4)装饰。可悲的是我得到了同样的错误。 – Ciwan

+0

@Ciwan奇怪,你能展示LINQ查询哪些产生这样的错误? – user2771704

+0

我没有这样的LINQ查询。我只是想测试以确保我的Db被创建,所以我创建了一个[DummyController](https://gist.github.com/Ciwan1859/e9a2d6ddcee0c2145a2b3e434c4021af),通过构造函数在我的上下文中传递。这应该强制EF Core创建我的数据库,正如您所看到的那样,该错误阻碍了这一点。 – Ciwan

0

请不要尝试宣告命名Id一个GUID属性,用get和set的IdentityUserLogin实体整个代码。

另一种选择是申报财产,并与[Key]属性

+0

嗯我认为'IdentityUser'已经有了吗? – Ciwan

+0

我在这回转也... – Leonardo