0

I'm new to building web applications with ASP.NET Core MVC.

My current issue is that I got a lot of errors trying to add users to my database. Previous issue that I had was when I tried creating a new user:

Cannot use table 'Users' for entity type 'Users' since it is being used for entity type 'CineLibrary User' and potentially other entity types, but there is no linking relationship. Add a foreign key to 'Users' on the primary key properties and pointing to the primary key on another entity type mapped to 'Users'.

The issue that I have now is with updating my database:

Cascading foreign key 'FK_RoleClaims_IdentityRoleClaim_Id' cannot be created where the referencing column 'RoleClaims.Id' is an identity column.
Could not create constraint or index. See previous errors.

Here is my migration that I'm trying to apply:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace CineLibrary.Infrastructure.Migrations
{
    public partial class IdentityChangesMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "AspNetRoleClaims");

            migrationBuilder.DropPrimaryKey(
                name: "PK_Users",
                table: "Users");

            migrationBuilder.RenameTable(
                name: "Users",
               newName: "IdentityUser");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "UserClaims",
                type: "int",
                nullable: false,
                oldClrType: typeof(int),
                oldType: "int")
                .OldAnnotation("SqlServer:Identity", "1, 1");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "RoleClaims",
                type: "int",
                nullable: false,
                oldClrType: typeof(int),
                oldType: "int")
                .OldAnnotation("SqlServer:Identity", "1, 1");

            migrationBuilder.AddColumn<string>(
                name: "Discriminator",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<int>(
                name: "IdentityUser_AccessFailedCount",
                table: "IdentityUser",
                type: "int",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_ConcurrencyStamp",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_Email",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<bool>(
                name: "IdentityUser_EmailConfirmed",
                table: "IdentityUser",
                type: "bit",
                nullable: true);

            migrationBuilder.AddColumn<bool>(
                name: "IdentityUser_LockoutEnabled",
                table: "IdentityUser",
                type: "bit",
                nullable: true);

            migrationBuilder.AddColumn<DateTimeOffset>(
                name: "IdentityUser_LockoutEnd",
                table: "IdentityUser",
                type: "datetimeoffset",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_NormalizedEmail",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_NormalizedUserName",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_PasswordHash",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_PhoneNumber",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<bool>(
                name: "IdentityUser_PhoneNumberConfirmed",
                table: "IdentityUser",
                type: "bit",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_SecurityStamp",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddColumn<bool>(
                name: "IdentityUser_TwoFactorEnabled",
                table: "IdentityUser",
                type: "bit",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "IdentityUser_UserName",
                table: "IdentityUser",
                type: "nvarchar(max)",
                nullable: true);

            migrationBuilder.AddPrimaryKey(
                name: "PK_IdentityUser",
                table: "IdentityUser",
                column: "Id");

            migrationBuilder.CreateTable(
               name: "AspNetRoleClaims",
               columns: table => new
               {
                   Id = table.Column<int>(type: "int", nullable: false)
                       .Annotation("SqlServer:Identity", "1, 1"),
                   RoleId = table.Column<string>(type: "nvarchar(450)", nullable: false),
                   ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
                   ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
               },
               constraints: table =>
               {
                   table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
                   table.ForeignKey(
                       name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
                       column: x => x.RoleId,
                       principalTable: "AspNetRoles",
                       principalColumn: "Id",
                       onDelete: ReferentialAction.Cascade);
               });

            migrationBuilder.CreateIndex(
                name: "IX_AspNetRoleClaims_RoleId",
                table: "AspNetRoleClaims",
                column: "RoleId");

            migrationBuilder.CreateTable(
                name: "IdentityRole",
                columns: table => new
                {
                    Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
                    Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    NormalizedName = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_IdentityRole", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "IdentityRoleClaim<string>",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    RoleId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_IdentityRoleClaim<string>", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "IdentityUserClaim<string>",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    UserId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_IdentityUserClaim<string>", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "IdentityUserLogin<string>",
                columns: table => new
                {
                    LoginProvider = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ProviderKey = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ProviderDisplayName = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    UserId = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                });

            migrationBuilder.CreateTable(
                name: "IdentityUserRole<string>",
                columns: table => new
                {
                    UserId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    RoleId = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                });

            migrationBuilder.CreateTable(
                name: "IdentityUserToken<string>",
                columns: table => new
                {
                    UserId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    LoginProvider = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Value = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                });

            migrationBuilder.AddForeignKey(
                name: "FK_RoleClaims_IdentityRoleClaim<string>_Id",
                table: "RoleClaims",
                column: "Id",
                principalTable: "IdentityRoleClaim<string>",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_Roles_IdentityRole_Id",
                table: "Roles",
                column: "Id",
                principalTable: "IdentityRole",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_UserClaims_IdentityUserClaim<string>_Id",
                table: "UserClaims",
                column: "Id",
                principalTable: "IdentityUserClaim<string>",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_RoleClaims_IdentityRoleClaim<string>_Id",
                table: "RoleClaims");

            migrationBuilder.DropForeignKey(
                name: "FK_Roles_IdentityRole_Id",
                table: "Roles");

            migrationBuilder.DropForeignKey(
                name: "FK_UserClaims_IdentityUserClaim<string>_Id",
                table: "UserClaims");

            migrationBuilder.DropTable(
                name: "IdentityRole");

            migrationBuilder.DropTable(
                name: "IdentityRoleClaim<string>");

            migrationBuilder.DropTable(
                name: "IdentityUserClaim<string>");

            migrationBuilder.DropTable(
                name: "IdentityUserLogin<string>");

            migrationBuilder.DropTable(
                name: "IdentityUserRole<string>");

            migrationBuilder.DropTable(
                name: "IdentityUserToken<string>");

            migrationBuilder.DropPrimaryKey(
                name: "PK_IdentityUser",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "Discriminator",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_AccessFailedCount",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_ConcurrencyStamp",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_Email",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_EmailConfirmed",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_LockoutEnabled",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_LockoutEnd",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_NormalizedEmail",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_NormalizedUserName",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_PasswordHash",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_PhoneNumber",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_PhoneNumberConfirmed",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_SecurityStamp",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_TwoFactorEnabled",
                table: "IdentityUser");

            migrationBuilder.DropColumn(
                name: "IdentityUser_UserName",
                table: "IdentityUser");

            migrationBuilder.RenameTable(
                name: "IdentityUser",
                newName: "Users");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "UserClaims",
                type: "int",
                nullable: false,
                oldClrType: typeof(int),
                oldType: "int")
                .Annotation("SqlServer:Identity", "1, 1");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "RoleClaims",
                type: "int",
                nullable: false,
                oldClrType: typeof(int),
                oldType: "int")
                .Annotation("SqlServer:Identity", "1, 1");

            migrationBuilder.AddPrimaryKey(
                name: "PK_Users",
                table: "Users",
                column: "Id");

            migrationBuilder.CreateTable(
                name: "AspNetRoleClaims",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    RoleId = table.Column<string>(type: "nvarchar(450)", nullable: false),
                    ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
                    table.ForeignKey(
                        name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
                        column: x => x.RoleId,
                        principalTable: "AspNetRoles",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateIndex(
                name: "IX_AspNetRoleClaims_RoleId",
                table: "AspNetRoleClaims",
                column: "RoleId");
        }
    }
}

The context class with all the tables:

// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using CineLibrary.Infrastructure.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace CineLibrary.Infrastructure.Data
{
    public partial class CineLibraryContext : IdentityDbContext<CineLibraryUser>
    {
        public CineLibraryContext()
        {
        }

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

        public virtual DbSet<AspNetRoles> AspNetRoles { get; set; }
        public virtual DbSet<AspNetUserClaims> AspNetUserClaims { get; set; }
        public virtual DbSet<AspNetUserLogins> AspNetUserLogins { get; set; }
        public virtual DbSet<AspNetUserTokens> AspNetUserTokens { get; set; }
        public virtual DbSet<AspNetUsers> AspNetUsers { get; set; }
        public virtual DbSet<Categories> Categories { get; set; }
        public virtual DbSet<Favourites> Favourites { get; set; }
        public virtual DbSet<Movies> Movies { get; set; }
        public virtual DbSet<RoleClaims> RoleClaims { get; set; }
        public virtual DbSet<Roles> Roles { get; set; }
        public virtual DbSet<UserClaims> UserClaims { get; set; }
        public virtual DbSet<UserLogins> UserLogins { get; set; }
        public virtual DbSet<UserRoles> UserRoles { get; set; }
        public virtual DbSet<UserTokens> UserTokens { get; set; }
        public virtual DbSet<Users> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Data Source=DESKTOP-0VH2JPM;Initial Catalog=CineLib;Integrated Security=True");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<IdentityUserLogin<string>>(entity =>
            {
                entity.HasNoKey();
            }).Entity<IdentityUserRole<string>>(entity =>
            {
                entity.HasNoKey();
            }).Entity<IdentityUserToken<string>>(entity =>
            {
                entity.HasNoKey();
            });

            modelBuilder.Entity<Users>(b =>
            {
                b.ToTable("IdentityUser");
                b.Property(x => x.Id).HasColumnName(nameof(IdentityUser.Id));
                b.HasOne<IdentityUser>().WithOne().HasForeignKey<IdentityUser>(x => x.Id);
            }).Entity<RoleClaims>(b =>
            {
                b.ToTable("IdentityRoleClaim<string>");
                b.Property(x => x.Id).HasColumnName(nameof(IdentityRoleClaim<string>.Id));
                b.HasOne<IdentityRoleClaim<string>>().WithOne().HasForeignKey<IdentityRoleClaim<string>>(x => x.Id);
            }).Entity<Roles>(b =>
            {
                b.ToTable("IdentityRole");
                b.Property(x => x.Id).HasColumnName(nameof(IdentityRole.Id));
                b.HasOne<IdentityRole>().WithOne().HasForeignKey<IdentityRole>(x => x.Id);
            }).Entity<UserClaims>(b =>
            {
                b.ToTable("IdentityUserClaim<string>");
                b.Property(x => x.Id).HasColumnName(nameof(IdentityUserClaim<string>.Id));
                b.HasOne<IdentityUserClaim<string>>().WithOne().HasForeignKey<IdentityUserClaim<string>>(x => x.Id);
            }).Entity<UserLogins>(b =>
            {
                b.ToTable("IdentityUserLogin<string>");
                b.Property(x => x.UserId).HasColumnName(nameof(IdentityUserLogin<string>.UserId));
                b.HasOne<IdentityUserLogin<string>>().WithOne().HasForeignKey<IdentityUserLogin<string>>(x => x.UserId);
            }).Entity<UserRoles>(b =>
            {
                b.ToTable("IdentityUserRole<string>");
                b.Property(x => x.UserId).HasColumnName(nameof(IdentityUserRole<string>.UserId));
                b.HasOne<IdentityUserRole<string>>().WithOne().HasForeignKey<IdentityUserRole<string>>(x => x.UserId);
            }).Entity<UserTokens>(b =>
            {
                b.ToTable("IdentityUserToken<string>");
                b.Property(x => x.UserId).HasColumnName(nameof(IdentityUserToken<string>.UserId));
                b.HasOne<IdentityUserToken<string>>().WithOne().HasForeignKey<IdentityUserToken<string>>(x => x.UserId);
            });

            modelBuilder.Entity<AspNetRoles>(entity =>
            {
                entity.HasIndex(e => e.NormalizedName, "RoleNameIndex")
                    .IsUnique()
                    .HasFilter("([NormalizedName] IS NOT NULL)");

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

                entity.Property(e => e.NormalizedName).HasMaxLength(256);
            });

            modelBuilder.Entity<AspNetUserClaims>(entity =>
            {
                entity.HasIndex(e => e.UserId, "IX_AspNetUserClaims_UserId");

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

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserClaims)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUserLogins>(entity =>
            {
                entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });

                entity.HasIndex(e => e.UserId, "IX_AspNetUserLogins_UserId");

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

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

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

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserLogins)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUserTokens>(entity =>
            {
                entity.HasKey(e => new { e.UserId, e.LoginProvider, e.Name });

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

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

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserTokens)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUsers>(entity =>
            {
                entity.HasIndex(e => e.NormalizedEmail, "EmailIndex");

                entity.HasIndex(e => e.NormalizedUserName, "UserNameIndex")
                    .IsUnique()
                    .HasFilter("([NormalizedUserName] IS NOT NULL)");

                entity.Property(e => e.Email).HasMaxLength(256);

                entity.Property(e => e.NormalizedEmail).HasMaxLength(256);

                entity.Property(e => e.NormalizedUserName).HasMaxLength(256);

                entity.Property(e => e.UserName).HasMaxLength(256);

                entity.HasMany(d => d.Role)
                    .WithMany(p => p.User)
                    .UsingEntity<Dictionary<string, object>>(
                        "AspNetUserRoles",
                        l => l.HasOne<AspNetRoles>().WithMany().HasForeignKey("RoleId"),
                        r => r.HasOne<AspNetUsers>().WithMany().HasForeignKey("UserId"),
                        j =>
                        {
                            j.HasKey("UserId", "RoleId");

                            j.ToTable("AspNetUserRoles");

                            j.HasIndex(new[] { "RoleId" }, "IX_AspNetUserRoles_RoleId");
                        });
            });

            modelBuilder.Entity<Categories>(entity =>
            {
                entity.HasKey(e => e.categoryId);

                entity.Property(e => e.categoryId).ValueGeneratedNever();

                entity.Property(e => e.categoryName).IsRequired();
            });

            modelBuilder.Entity<Favourites>(entity =>
            {
                entity.HasKey(e => e.favouriteId);

                entity.Property(e => e.favouriteId).ValueGeneratedNever();
            });

            modelBuilder.Entity<Movies>(entity =>
            {
                entity.HasKey(e => e.movieId);

                entity.Property(e => e.movieId).ValueGeneratedNever();

                entity.Property(e => e.movieName).IsRequired();
            });

            modelBuilder.Entity<UserLogins>(entity =>
            {
                entity.HasNoKey();
            });

            modelBuilder.Entity<UserRoles>(entity =>
            {
                entity.HasNoKey();
            });

            modelBuilder.Entity<UserTokens>(entity =>
            {
                entity.HasNoKey();
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Marky
  • 55
  • 7
  • You can refer to these issues: [link1](https://github.com/abpframework/abp/issues/8950),[link2](https://stackoverflow.com/questions/55849695/cannot-use-table-accounts-for-entity-type-user-since-it-is-being-used-for-en) – Xinran Shen Dec 29 '22 at 02:16

0 Answers0