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);
}
}