【问题标题】:.Net Core API with EF Core Code First and IdentityUser.Net Core API 与 EF Core Code First 和 IdentityUser
【发布时间】:2018-01-15 19:28:30
【问题描述】:

我有一个existing application,我正在将它重写为带有 ReactJS 前端的 .NET Core API。我还在 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; }
}

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

问题

应用程序构建良好,但是当我尝试通过点击需要访问数据库的控制器来运行它时,我收到以下错误:

实体类型“IdentityUserLogin”需要定义一个主键。

我在使用常规 EF Code First(不是核心)和 the fix for that 时遇到了这个问题,在这里不起作用。

【问题讨论】:

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


    【解决方案1】:

    如果我在 DbContext 类中使用下一个代码,则此模型对我有用(已编译,运行时没有异常):

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

    如果不调用 base.OnModelCreating(builder) 我会得到同样的错误,因为在这种情况下上下文没有应用与身份相关的架构。

    更新: 从下面的屏幕截图中可以看出,一切对我来说都很好:

    我还有一个想法,为什么会出现这样的错误。你的 BbContext 是继承自 DbContext 类还是 IdentityDbContext&lt;IdentityUser&gt;?因为如果我使用通常的 DbContext 类,我会遇到与您的屏幕截图相同的错误。

    为了使身份表正常工作,您应该使用IdentityDbContext&lt;IdentityUser&gt;。在我的工作 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);
            }
        }
    

    【讨论】:

    • 我只是继续前进,tried what you suggested。可悲的是我得到了同样的错误。
    • @Ciwan Strange,你能显示产生这种错误的 LINQ 查询吗?
    • 我没有这样的 LINQ 查询。我只是想测试以确保我的 Db 被创建,所以我创建了一个 DummyController 通过构造函数传入我的上下文。这应该会强制 EF Core 创建我的数据库,并且如您所见,该错误会妨碍这样做。
    • @Ciwan 我明白了,请检查我更新的答案,使用它的解决方案对我来说效果很好。
    • 我使用的是DbContext。我将其更改为IdentityDbContext&lt;IdentityUser&gt;,现在一切正常。非常感谢。
    【解决方案2】:

    请尝试声明一个名为 Id 的 Guid 属性,并在 IdentityUserLogin 实体上同时使用 Get 和 Set。

    另一种选择是声明一个属性并用[Key] 属性装饰它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多