【问题标题】:Entity framework code first approach getting "primary key required" error for a table实体框架代码优先方法获取表的“需要主键”错误
【发布时间】:2017-04-06 06:11:39
【问题描述】:

我正在尝试使用 Code First 方法。在 AspNetUserLogins 表中,我有 LoginProviderProviderKey 的复合主键。现在我收到此表的以下错误:

"InvalidOperationException: 实体类型 'AspNetUserLogins' 需要定义主键。”

另外,没有创建数据库。

我的上下文类:

    public partial class MyTestDB_devContext : IdentityDbContext<ApplicationUser>
    {
       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)
       {
         optionsBuilder.UseSqlServer(@"Server=.\SQLExpress;Database=MyTestDB;Trusted_Connection=True;");
       }

       protected override void OnModelCreating(ModelBuilder modelBuilder)
       { modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin<string>", b =>
                {
                    b.Property<string>("LoginProvider");        
                    b.Property<string>("ProviderKey");        
                    b.Property<string>("ProviderDisplayName");        
                    b.Property<string>("UserId")
                        .IsRequired();        
                    b.HasKey("LoginProvider", "ProviderKey");        
                    b.HasIndex("UserId");        
                    b.ToTable("AspNetUserLogins");
                });
           modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b =>
              {
                   ...        
                    b.ToTable("AspNetRoles");
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim<string>", b =>
                {
                   ...        
                    b.ToTable("AspNetRoleClaims");
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim<string>", b =>
                {
                    ...        
                    b.ToTable("AspNetUserClaims");
                });   
                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole<string>", b =>
                {
                    ...        
                    b.ToTable("AspNetUserRoles");
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken<string>", b =>
                {
                    ...        
                    b.ToTable("AspNetUserTokens");
                });

                modelBuilder.Entity<DataModel.DBModels.ApplicationUser>( b =>
                {
                    ...          
                    b.ToTable("AspNetUsers");
                }); 
                      modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim<string>", b =>
                {                        b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole")
                        .WithMany("Claims")
                        .HasForeignKey("RoleId")
                        .OnDelete(DeleteBehavior.Cascade);
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim<string>", b =>
                {
                    b.HasOne("DataModel.DBModels.ApplicationUser")
                        .WithMany("Claims")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade);
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin<string>", b =>
                {
                    b.HasOne("DataModel.DBModels.ApplicationUser")
                        .WithMany("Logins")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade);
                });

                modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole<string>", b =>
                {                        b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole")
                        .WithMany("Users")
                        .HasForeignKey("RoleId")
                        .OnDelete(DeleteBehavior.Cascade);

                    b.HasOne("DataModel.DBModels.ApplicationUser")
                        .WithMany("Roles")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade);
                });
            }
        }

我为'AspNetUserLogins' 添加了 HasKey 选项,但我仍然遇到同样的错误。

【问题讨论】:

标签: c# entity-framework asp.net-core ef-code-first identityserver4


【解决方案1】:

我认为问题出在这段代码上:

public virtual DbSet<AspNetRoleClaims> AspNetRoleClaims { get; set; }

DbSet 的类型参数与 DbSet 变量本身相同。 它应该看起来像这样:

public virtual DbSet<AspNetRoleClaim> AspNetRoleClaims { get; set; }

因为AspNetRoleClaims 是一个表,记录类型为AspNetRoleClaim

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2020-05-14
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多