I need to link two tables (AspNetUsers which uses custom ApplicationUser class, and a custom Projects class). I want the users to have multiple projects, and vice versa. I have added the following code into both of my models; however, when doing migrations and updating the database, no linking table is created.
Here is my ApplicationUser class:
using System;
using System.Security.Claims;
using IssueTracker.Models;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Identity;
namespace IssueTracker.Areas.Identity.Data
{
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
this.Projects = new HashSet<ProjectModel>();
}
public String? FirstName { get; set; }
public String? LastName { get; set; }
public String? Role { get; set; }
public virtual ICollection<ProjectModel> Projects { get; set; }
}
}
and here is my Project model class:
using System;
using Microsoft.AspNetCore.Identity;
using IssueTracker.Areas.Identity.Data;
using System.ComponentModel.DataAnnotations;
namespace IssueTracker.Models
{
public class ProjectModel
{
public ProjectModel()
{
this.Users = new HashSet<ApplicationUser>();
}
public int Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public virtual ICollection<ApplicationUser> Users { get; set; }
}
}
and here is my DbContext:
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using IssueTracker.Models;
namespace IssueTracker.Areas.Identity.Data;
public class IssueTrackerIdentityDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<ProjectModel> Projects { get; set; }
public IssueTrackerIdentityDbContext()
{
}
public IssueTrackerIdentityDbContext(DbContextOptions<IssueTrackerIdentityDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
builder.ApplyConfiguration(new ApplicationUserEntityConfiguration());
}
}
public class ApplicationUserEntityConfiguration : IEntityTypeConfiguration<ApplicationUser>
{
public void Configure(EntityTypeBuilder<ApplicationUser> builder)
{
builder.Property(u => u.FirstName).HasMaxLength(255);
builder.Property(u => u.LastName).HasMaxLength(255);
}
}
After running a migration with the code above, I am given this migration which does not create a table to link the two.
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IssueTracker.Migrations
{
public partial class UserProjectTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "ID",
table: "Projects",
newName: "Id");
migrationBuilder.AddColumn<string>(
name: "ApplicationUserId",
table: "Projects",
type: "TEXT",
nullable: true);
migrationBuilder.CreateIndex(
name: "IX_Projects_ApplicationUserId",
table: "Projects",
column: "ApplicationUserId");
migrationBuilder.AddForeignKey(
name: "FK_Projects_AspNetUsers_ApplicationUserId",
table: "Projects",
column: "ApplicationUserId",
principalTable: "AspNetUsers",
principalColumn: "Id");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Projects_AspNetUsers_ApplicationUserId",
table: "Projects");
migrationBuilder.DropIndex(
name: "IX_Projects_ApplicationUserId",
table: "Projects");
migrationBuilder.DropColumn(
name: "ApplicationUserId",
table: "Projects");
migrationBuilder.RenameColumn(
name: "Id",
table: "Projects",
newName: "ID");
}
}
}
How should I update my code so that I can properly create a many-to-many relationship between ApplicationUser and Projects. Also, once this relationship is created, how can I properly access and modify the relationship. Do I need to update all 3 classes whenever a user is added to a project (or vice versa), or do I solely need to update the linking table. Thank you so much. I am new to MVC so forgive me if this is very rudimentary.
try this too:
public class ApplicationUserEntityConfiguration :
IEntityTypeConfiguration<ApplicationUser>
{
public void Configure(EntityTypeBuilder<ApplicationUser> builder)
{
builder.Property(u => u.FirstName).HasMaxLength(255);
builder.Property(u => u.LastName).HasMaxLength(255);
builder.HasMany(x => x.Projects).WithMany(x => x.Users);
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.