繁体   English   中英

实体类型“AspNetUserLogins”需要定义主键?

[英]The entity type 'AspNetUserLogins' requires a primary key to be defined?

我用 EF mydbcontext了我的数据库,并将mydbcontext更改为从IdentityDbContext继承,因为我希望所有内容都在一个dbcontext

问题是,当我启动应用程序并在登录页面中写入凭据时,出现异常:

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

我以前没有得到过,因为我正在调用base.OnModelCreating(modelBuilder); 我究竟做错了什么?

public partial class AdventuresContext : IdentityDbContext<ApplicationUser> 
{
    public AdventuresContext()
    {
    }

    public AdventuresContext(DbContextOptions<AdventuresContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Adventures> Adventures { get; set; }
    public virtual DbSet<AspNetRoleClaims> AspNetRoleClaims { get; set; }
    public virtual DbSet<AspNetRoles> AspNetRoles { get; set; }
    public virtual DbSet<AspNetUserClaims> AspNetUserClaims { get; set; }
    public virtual DbSet<AspNetUserLogins> AspNetUserLogins { get; set; }
    public virtual DbSet<AspNetUserRoles> AspNetUserRoles { get; set; }
    public virtual DbSet<AspNetUserTokens> AspNetUserTokens { get; set; }
    public virtual DbSet<AspNetUsers> AspNetUsers { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Adventures");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasAnnotation("ProductVersion", "2.2.4-servicing-10062");

        modelBuilder.Entity<Adventures>(entity =>
        {
            entity.HasIndex(e => e.UserId);

            entity.Property(e => e.CountryCodeIso03from).HasColumnName("CountryCodeISO03From");

            entity.Property(e => e.CountryCodeIso03to).HasColumnName("CountryCodeISO03To");

            entity.Property(e => e.Name).HasMaxLength(50);

            entity.Property(e => e.ShortDescription).HasMaxLength(128);

            entity.Property(e => e.Timestamp).IsRowVersion();

            entity.Property(e => e.UserId).IsRequired();

            entity.HasOne(d => d.User)
                .WithMany(p => p.Adventures)
                .HasForeignKey(d => d.UserId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Adventures_Adventures");
        });
     }
 }

我相信有两种方法可以解决这个问题。

您可以使用 getter 和 setter 在 AspNetUserLogins 类中的公共属性上添加 [Key],例如:

[Key]
public int SomeFieldName {get;set;} 

或者您可以使用您的 OnModelCreating 覆盖来调用 HasNoKey(),例如:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
    .Entity<AspNetUserLogins>(o =>
    {
        o.HasNoKey();
    });
}

AspNetUsersLogins 是 Identity 附带的标准类。 它有 2 个主键,分别是 LoginProvider 和 ProviderKey。 我试图将它们从字符串更改为 Guid,但仍然是相同的消息。 我还尝试将 [Key] 属性放在它们两个上,但我有一个例外:“InvalidOperationException:实体类型‘AspNetUserLogins’具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API。” . 还有其他想法吗?EF 搭建的 AspNetUsersLogins 看起来像这样:

public partial class AspNetUserLogins
{

    public string LoginProvider { get; set; }
    public string ProviderKey { get; set; }
    public string ProviderDisplayName { get; set; }
    public string UserId { get; set; }

    public virtual AspNetUsers User { get; set; }
}

由于您是从IdentityDbContext继承的,因此您无需重新创建AspNet* DbSet,我建议您删除所有内置的DbSet<AspNet*>modelBuilder.Entity<AspNet*>.

public partial class AdventuresContext : IdentityDbContext<ApplicationUser>
{
    public AdventuresContext ()
    {
    }

    public AdventuresContext (DbContextOptions<AdventuresContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Adventures> Adventures { get; set; }
    //remove below DbSet
    //public virtual DbSet<AspNetRoleClaims> AspNetRoleClaims { get; set; }
    //public virtual DbSet<AspNetRoles> AspNetRoles { get; set; }
    //public virtual DbSet<AspNetUserClaims> AspNetUserClaims { get; set; }
    //public virtual DbSet<AspNetUserLogins> AspNetUserLogins { get; set; }
    //public virtual DbSet<AspNetUserRoles> AspNetUserRoles { get; set; }
    //public virtual DbSet<AspNetUserTokens> AspNetUserTokens { get; set; }
    //public virtual DbSet<AspNetUsers> AspNetUsers { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Adventures");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //...
    } 
}

启动文件

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();

        var conn = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Adventures";
        services.AddDbContext<AdventuresContext>(options =>
            options.UseSqlServer(conn));
        services.AddDefaultIdentity<ApplicationUser>()
            .AddEntityFrameworkStores<AdventuresContext>();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM