From ed4f8c39fe246b71731629d6ef80dfb4afe3823e Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:30:28 +0000 Subject: [PATCH 1/3] Initial plan From 7f247ed5dce7bbfcc0a3574e8b464f7e6cbf601d Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:35:43 +0000 Subject: [PATCH 2/3] Add Certificate entity configuration and create migration Co-authored-by: kavyashri-as <213833080+kavyashri-as@users.noreply.github.com> --- .../CourseRegistration.API.csproj | 4 + api/CourseRegistration.API/appsettings.json | 3 + .../CourseRegistration.Infrastructure.csproj | 5 + .../Data/CourseRegistrationDbContext.cs | 40 +++ .../CourseRegistrationDbContextFactory.cs | 26 ++ ...6133515_AddCertificateEntities.Designer.cs | 248 ++++++++++++++++++ .../20260316133515_AddCertificateEntities.cs | 162 ++++++++++++ ...ourseRegistrationDbContextModelSnapshot.cs | 245 +++++++++++++++++ 8 files changed, 733 insertions(+) create mode 100644 api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs create mode 100644 api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.Designer.cs create mode 100644 api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.cs create mode 100644 api/CourseRegistration.Infrastructure/Migrations/CourseRegistrationDbContextModelSnapshot.cs diff --git a/api/CourseRegistration.API/CourseRegistration.API.csproj b/api/CourseRegistration.API/CourseRegistration.API.csproj index 1653847..884bfd7 100644 --- a/api/CourseRegistration.API/CourseRegistration.API.csproj +++ b/api/CourseRegistration.API/CourseRegistration.API.csproj @@ -8,6 +8,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/api/CourseRegistration.API/appsettings.json b/api/CourseRegistration.API/appsettings.json index 10f68b8..420cb0e 100644 --- a/api/CourseRegistration.API/appsettings.json +++ b/api/CourseRegistration.API/appsettings.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=CourseRegistrationDb;Trusted_Connection=True;MultipleActiveResultSets=true" + }, "Logging": { "LogLevel": { "Default": "Information", diff --git a/api/CourseRegistration.Infrastructure/CourseRegistration.Infrastructure.csproj b/api/CourseRegistration.Infrastructure/CourseRegistration.Infrastructure.csproj index 989b1e8..3223ddd 100644 --- a/api/CourseRegistration.Infrastructure/CourseRegistration.Infrastructure.csproj +++ b/api/CourseRegistration.Infrastructure/CourseRegistration.Infrastructure.csproj @@ -6,7 +6,12 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContext.cs b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContext.cs index 7491da8..26572d1 100644 --- a/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContext.cs +++ b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContext.cs @@ -32,6 +32,11 @@ public CourseRegistrationDbContext(DbContextOptions /// public DbSet Registrations { get; set; } = null!; + /// + /// Certificates DbSet + /// + public DbSet Certificates { get; set; } = null!; + /// /// Configures the model relationships and constraints /// @@ -108,6 +113,41 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasForeignKey(r => r.CourseId) .OnDelete(DeleteBehavior.Cascade); }); + + // Configure Certificate entity + modelBuilder.Entity(entity => + { + entity.HasKey(c => c.CertificateId); + entity.Property(c => c.CertificateId).IsRequired(); + entity.Property(c => c.StudentId).IsRequired(); + entity.Property(c => c.CourseId).IsRequired(); + entity.Property(c => c.IssueDate).IsRequired(); + entity.Property(c => c.FinalGrade).IsRequired() + .HasConversion(); + entity.Property(c => c.CertificateNumber).IsRequired().HasMaxLength(20); + entity.Property(c => c.Remarks).HasMaxLength(200); + entity.Property(c => c.DigitalSignature).HasMaxLength(100); + + // Create index on CertificateNumber for quick lookups + entity.HasIndex(c => c.CertificateNumber).IsUnique(); + + // Create index on StudentId for efficient student certificate queries + entity.HasIndex(c => c.StudentId); + + // Create index on CourseId for efficient course certificate queries + entity.HasIndex(c => c.CourseId); + + // Configure relationships + entity.HasOne(c => c.Student) + .WithMany() + .HasForeignKey(c => c.StudentId) + .OnDelete(DeleteBehavior.Restrict); + + entity.HasOne(c => c.Course) + .WithMany() + .HasForeignKey(c => c.CourseId) + .OnDelete(DeleteBehavior.Restrict); + }); } /// diff --git a/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs new file mode 100644 index 0000000..1486cab --- /dev/null +++ b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; + +namespace CourseRegistration.Infrastructure.Data; + +/// +/// Design-time factory for CourseRegistrationDbContext to support EF Core migrations +/// +public class CourseRegistrationDbContextFactory : IDesignTimeDbContextFactory +{ + /// + /// Creates a new instance of CourseRegistrationDbContext for design-time operations + /// + public CourseRegistrationDbContext CreateDbContext(string[] args) + { + var optionsBuilder = new DbContextOptionsBuilder(); + + // Use SQL Server for migrations with a default connection string + // This connection string can be overridden at runtime via configuration + optionsBuilder.UseSqlServer( + "Server=(localdb)\\mssqllocaldb;Database=CourseRegistrationDb;Trusted_Connection=True;MultipleActiveResultSets=true", + options => options.MigrationsAssembly("CourseRegistration.Infrastructure")); + + return new CourseRegistrationDbContext(optionsBuilder.Options); + } +} diff --git a/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.Designer.cs b/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.Designer.cs new file mode 100644 index 0000000..9f0ce02 --- /dev/null +++ b/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.Designer.cs @@ -0,0 +1,248 @@ +// +using System; +using CourseRegistration.Infrastructure.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace CourseRegistration.Infrastructure.Migrations +{ + [DbContext(typeof(CourseRegistrationDbContext))] + [Migration("20260316133515_AddCertificateEntities")] + partial class AddCertificateEntities + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Certificate", b => + { + b.Property("CertificateId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CertificateNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("CourseId") + .HasColumnType("uniqueidentifier"); + + b.Property("DigitalSignature") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FinalGrade") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IssueDate") + .HasColumnType("datetime2"); + + b.Property("Remarks") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("StudentId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CertificateId"); + + b.HasIndex("CertificateNumber") + .IsUnique(); + + b.HasIndex("CourseId"); + + b.HasIndex("StudentId"); + + b.ToTable("Certificates"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Course", b => + { + b.Property("CourseId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CourseName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("InstructorName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Schedule") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("CourseId"); + + b.ToTable("Courses"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Registration", b => + { + b.Property("RegistrationId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CourseId") + .HasColumnType("uniqueidentifier"); + + b.Property("Grade") + .HasColumnType("nvarchar(max)"); + + b.Property("Notes") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("RegistrationDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("StudentId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("RegistrationId"); + + b.HasIndex("CourseId"); + + b.HasIndex("StudentId", "CourseId") + .IsUnique(); + + b.ToTable("Registrations"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Student", b => + { + b.Property("StudentId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("DateOfBirth") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("PhoneNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("StudentId"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Certificate", b => + { + b.HasOne("CourseRegistration.Domain.Entities.Course", "Course") + .WithMany() + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("CourseRegistration.Domain.Entities.Student", "Student") + .WithMany() + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Course"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Registration", b => + { + b.HasOne("CourseRegistration.Domain.Entities.Course", "Course") + .WithMany("Registrations") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CourseRegistration.Domain.Entities.Student", "Student") + .WithMany("Registrations") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Course"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Course", b => + { + b.Navigation("Registrations"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Student", b => + { + b.Navigation("Registrations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.cs b/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.cs new file mode 100644 index 0000000..9b6fbe3 --- /dev/null +++ b/api/CourseRegistration.Infrastructure/Migrations/20260316133515_AddCertificateEntities.cs @@ -0,0 +1,162 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CourseRegistration.Infrastructure.Migrations +{ + /// + public partial class AddCertificateEntities : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Courses", + columns: table => new + { + CourseId = table.Column(type: "uniqueidentifier", nullable: false), + CourseName = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + Description = table.Column(type: "nvarchar(500)", maxLength: 500, nullable: true), + InstructorName = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + StartDate = table.Column(type: "datetime2", nullable: false), + EndDate = table.Column(type: "datetime2", nullable: false), + Schedule = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + IsActive = table.Column(type: "bit", nullable: false), + CreatedAt = table.Column(type: "datetime2", nullable: false), + UpdatedAt = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Courses", x => x.CourseId); + }); + + migrationBuilder.CreateTable( + name: "Students", + columns: table => new + { + StudentId = table.Column(type: "uniqueidentifier", nullable: false), + FirstName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + LastName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + PhoneNumber = table.Column(type: "nvarchar(20)", maxLength: 20, nullable: true), + DateOfBirth = table.Column(type: "datetime2", nullable: false), + CreatedAt = table.Column(type: "datetime2", nullable: false), + UpdatedAt = table.Column(type: "datetime2", nullable: false), + IsActive = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Students", x => x.StudentId); + }); + + migrationBuilder.CreateTable( + name: "Certificates", + columns: table => new + { + CertificateId = table.Column(type: "uniqueidentifier", nullable: false), + StudentId = table.Column(type: "uniqueidentifier", nullable: false), + CourseId = table.Column(type: "uniqueidentifier", nullable: false), + IssueDate = table.Column(type: "datetime2", nullable: false), + FinalGrade = table.Column(type: "nvarchar(max)", nullable: false), + CertificateNumber = table.Column(type: "nvarchar(20)", maxLength: 20, nullable: false), + Remarks = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + DigitalSignature = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Certificates", x => x.CertificateId); + table.ForeignKey( + name: "FK_Certificates_Courses_CourseId", + column: x => x.CourseId, + principalTable: "Courses", + principalColumn: "CourseId", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_Certificates_Students_StudentId", + column: x => x.StudentId, + principalTable: "Students", + principalColumn: "StudentId", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "Registrations", + columns: table => new + { + RegistrationId = table.Column(type: "uniqueidentifier", nullable: false), + StudentId = table.Column(type: "uniqueidentifier", nullable: false), + CourseId = table.Column(type: "uniqueidentifier", nullable: false), + RegistrationDate = table.Column(type: "datetime2", nullable: false), + Status = table.Column(type: "nvarchar(max)", nullable: false), + Grade = table.Column(type: "nvarchar(max)", nullable: true), + Notes = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Registrations", x => x.RegistrationId); + table.ForeignKey( + name: "FK_Registrations_Courses_CourseId", + column: x => x.CourseId, + principalTable: "Courses", + principalColumn: "CourseId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Registrations_Students_StudentId", + column: x => x.StudentId, + principalTable: "Students", + principalColumn: "StudentId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Certificates_CertificateNumber", + table: "Certificates", + column: "CertificateNumber", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Certificates_CourseId", + table: "Certificates", + column: "CourseId"); + + migrationBuilder.CreateIndex( + name: "IX_Certificates_StudentId", + table: "Certificates", + column: "StudentId"); + + migrationBuilder.CreateIndex( + name: "IX_Registrations_CourseId", + table: "Registrations", + column: "CourseId"); + + migrationBuilder.CreateIndex( + name: "IX_Registrations_StudentId_CourseId", + table: "Registrations", + columns: new[] { "StudentId", "CourseId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Students_Email", + table: "Students", + column: "Email", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Certificates"); + + migrationBuilder.DropTable( + name: "Registrations"); + + migrationBuilder.DropTable( + name: "Courses"); + + migrationBuilder.DropTable( + name: "Students"); + } + } +} diff --git a/api/CourseRegistration.Infrastructure/Migrations/CourseRegistrationDbContextModelSnapshot.cs b/api/CourseRegistration.Infrastructure/Migrations/CourseRegistrationDbContextModelSnapshot.cs new file mode 100644 index 0000000..b4c8b9c --- /dev/null +++ b/api/CourseRegistration.Infrastructure/Migrations/CourseRegistrationDbContextModelSnapshot.cs @@ -0,0 +1,245 @@ +// +using System; +using CourseRegistration.Infrastructure.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace CourseRegistration.Infrastructure.Migrations +{ + [DbContext(typeof(CourseRegistrationDbContext))] + partial class CourseRegistrationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Certificate", b => + { + b.Property("CertificateId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CertificateNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("CourseId") + .HasColumnType("uniqueidentifier"); + + b.Property("DigitalSignature") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FinalGrade") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IssueDate") + .HasColumnType("datetime2"); + + b.Property("Remarks") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("StudentId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CertificateId"); + + b.HasIndex("CertificateNumber") + .IsUnique(); + + b.HasIndex("CourseId"); + + b.HasIndex("StudentId"); + + b.ToTable("Certificates"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Course", b => + { + b.Property("CourseId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CourseName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("InstructorName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Schedule") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("CourseId"); + + b.ToTable("Courses"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Registration", b => + { + b.Property("RegistrationId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CourseId") + .HasColumnType("uniqueidentifier"); + + b.Property("Grade") + .HasColumnType("nvarchar(max)"); + + b.Property("Notes") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("RegistrationDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("StudentId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("RegistrationId"); + + b.HasIndex("CourseId"); + + b.HasIndex("StudentId", "CourseId") + .IsUnique(); + + b.ToTable("Registrations"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Student", b => + { + b.Property("StudentId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("DateOfBirth") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("PhoneNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("StudentId"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Certificate", b => + { + b.HasOne("CourseRegistration.Domain.Entities.Course", "Course") + .WithMany() + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("CourseRegistration.Domain.Entities.Student", "Student") + .WithMany() + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Course"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Registration", b => + { + b.HasOne("CourseRegistration.Domain.Entities.Course", "Course") + .WithMany("Registrations") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CourseRegistration.Domain.Entities.Student", "Student") + .WithMany("Registrations") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Course"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Course", b => + { + b.Navigation("Registrations"); + }); + + modelBuilder.Entity("CourseRegistration.Domain.Entities.Student", b => + { + b.Navigation("Registrations"); + }); +#pragma warning restore 612, 618 + } + } +} From 0724e3f82a53f9e22dcabe79469370c842f5983a Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:40:54 +0000 Subject: [PATCH 3/3] Complete T012: Apply EF Core migration to database Co-authored-by: kavyashri-as <213833080+kavyashri-as@users.noreply.github.com> --- .../Data/CourseRegistrationDbContextFactory.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs index 1486cab..86cf9d4 100644 --- a/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs +++ b/api/CourseRegistration.Infrastructure/Data/CourseRegistrationDbContextFactory.cs @@ -15,10 +15,13 @@ public CourseRegistrationDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder(); - // Use SQL Server for migrations with a default connection string - // This connection string can be overridden at runtime via configuration + // Use SQL Server for migrations + // Connection string can be overridden via environment variable + var connectionString = Environment.GetEnvironmentVariable("MIGRATION_CONNECTION_STRING") + ?? "Server=localhost,1433;Database=CourseRegistrationDb;User Id=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True;MultipleActiveResultSets=true"; + optionsBuilder.UseSqlServer( - "Server=(localdb)\\mssqllocaldb;Database=CourseRegistrationDb;Trusted_Connection=True;MultipleActiveResultSets=true", + connectionString, options => options.MigrationsAssembly("CourseRegistration.Infrastructure")); return new CourseRegistrationDbContext(optionsBuilder.Options);