From e3aa1687dc4ba6947d8824897d0fe0a201627714 Mon Sep 17 00:00:00 2001
From: Maxchil <m.w.bohdanowicz@gmail.com>
Date: Fri, 12 Jun 2020 16:16:59 +0200
Subject: [PATCH] setup ef core repository & posgre, init migration

---
 src/Internship.Api/.dockerignore              |  24 +
 src/Internship.Api/Internship.Api.csproj      |   1 +
 .../Internship.Repository.csproj              |  12 +-
 .../InternshipDbContext.cs                    |  39 ++
 .../20200612141652_InitialCreate.Designer.cs  | 428 ++++++++++++++++++
 .../20200612141652_InitialCreate.cs           | 271 +++++++++++
 .../InternshipDbContextModelSnapshot.cs       | 426 +++++++++++++++++
 7 files changed, 1200 insertions(+), 1 deletion(-)
 create mode 100644 src/Internship.Api/.dockerignore
 create mode 100644 src/Internship.Repository/InternshipDbContext.cs
 create mode 100644 src/Internship.Repository/Migrations/20200612141652_InitialCreate.Designer.cs
 create mode 100644 src/Internship.Repository/Migrations/20200612141652_InitialCreate.cs
 create mode 100644 src/Internship.Repository/Migrations/InternshipDbContextModelSnapshot.cs

diff --git a/src/Internship.Api/.dockerignore b/src/Internship.Api/.dockerignore
new file mode 100644
index 0000000..257cb48
--- /dev/null
+++ b/src/Internship.Api/.dockerignore
@@ -0,0 +1,24 @@
+**/.classpath
+**/.dockerignore
+**/.env
+**/.git
+**/.gitignore
+**/.project
+**/.settings
+**/.toolstarget
+**/.vs
+**/.vscode
+**/*.*proj.user
+**/*.dbmdl
+**/*.jfm
+**/azds.yaml
+**/bin
+**/charts
+**/docker-compose*
+**/Dockerfile*
+**/node_modules
+**/npm-debug.log
+**/obj
+**/secrets.dev.yaml
+**/values.dev.yaml
+README.md
\ No newline at end of file
diff --git a/src/Internship.Api/Internship.Api.csproj b/src/Internship.Api/Internship.Api.csproj
index 720285f..cb39023 100644
--- a/src/Internship.Api/Internship.Api.csproj
+++ b/src/Internship.Api/Internship.Api.csproj
@@ -6,6 +6,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
     <PackageReference Include="Serilog" Version="2.9.0" />
     <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
     <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
diff --git a/src/Internship.Repository/Internship.Repository.csproj b/src/Internship.Repository/Internship.Repository.csproj
index e137f83..00bc49b 100644
--- a/src/Internship.Repository/Internship.Repository.csproj
+++ b/src/Internship.Repository/Internship.Repository.csproj
@@ -1,12 +1,22 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="EFCore.NamingConventions" Version="1.1.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.5">
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+      <PrivateAssets>all</PrivateAssets>
+    </PackageReference>
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
     <PackageReference Include="Serilog" Version="2.9.0" />
     <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
   </ItemGroup>
 
+  <ItemGroup>
+    <ProjectReference Include="..\Internship.Core\Internship.Core.csproj" />
+  </ItemGroup>
+
 </Project>
diff --git a/src/Internship.Repository/InternshipDbContext.cs b/src/Internship.Repository/InternshipDbContext.cs
new file mode 100644
index 0000000..7b5bfe8
--- /dev/null
+++ b/src/Internship.Repository/InternshipDbContext.cs
@@ -0,0 +1,39 @@
+using Microsoft.EntityFrameworkCore;
+using Internship.Core;
+
+namespace Internship.Repository
+{
+    public class InternshipDbContext : DbContext
+    {
+        public DbSet<InternshipEntity> Internships { get; set; }
+        public DbSet<Company> Companies { get; set; }
+        public DbSet<Edition> Editions { get; set; }
+        public DbSet<Report> Reports { get; set; }
+        public DbSet<Intern> Interns { get; set; }
+
+        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
+            optionsBuilder
+                .UseNpgsql("Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=szwoniu")
+                .UseSnakeCaseNamingConvention();
+
+        protected override void OnModelCreating(ModelBuilder modelBuilder) {
+            modelBuilder
+                .Entity<InternshipEntity>(ie => {
+                    ie.OwnsOne(i => i.DeanAcceptance);
+                    ie.OwnsOne(i => i.Insurance);
+                });
+            
+            modelBuilder
+                .Entity<Company>()
+                .HasKey(c => c.Nip);
+            
+            modelBuilder
+                .Entity<BranchOffice>()
+                .OwnsOne(b => b.Address);
+
+            modelBuilder
+                .Entity<Intern>()
+                .HasKey(i => i.AlbumNumber);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Internship.Repository/Migrations/20200612141652_InitialCreate.Designer.cs b/src/Internship.Repository/Migrations/20200612141652_InitialCreate.Designer.cs
new file mode 100644
index 0000000..919d734
--- /dev/null
+++ b/src/Internship.Repository/Migrations/20200612141652_InitialCreate.Designer.cs
@@ -0,0 +1,428 @@
+// <auto-generated />
+using System;
+using Internship.Repository;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace Internship.Repository.Migrations
+{
+    [DbContext(typeof(InternshipDbContext))]
+    [Migration("20200612141652_InitialCreate")]
+    partial class InitialCreate
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
+                .HasAnnotation("ProductVersion", "3.1.5")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            modelBuilder.Entity("Internship.Core.BranchOffice", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("CompanyNip")
+                        .HasColumnName("company_nip")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Provider")
+                        .HasColumnName("provider")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_branch_office");
+
+                    b.HasIndex("CompanyNip")
+                        .HasName("ix_branch_office_company_nip");
+
+                    b.ToTable("branch_office");
+                });
+
+            modelBuilder.Entity("Internship.Core.Company", b =>
+                {
+                    b.Property<string>("Nip")
+                        .HasColumnName("nip")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Provider")
+                        .HasColumnName("provider")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Range")
+                        .HasColumnName("range")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("SiteAddress")
+                        .HasColumnName("site_address")
+                        .HasColumnType("text");
+
+                    b.HasKey("Nip")
+                        .HasName("pk_companies");
+
+                    b.ToTable("companies");
+                });
+
+            modelBuilder.Entity("Internship.Core.Course", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.HasKey("Id")
+                        .HasName("pk_course");
+
+                    b.ToTable("course");
+                });
+
+            modelBuilder.Entity("Internship.Core.Edition", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnName("end_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<DateTime>("IPPDeadlineDate")
+                        .HasColumnName("ipp_deadline_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnName("start_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.HasKey("Id")
+                        .HasName("pk_editions");
+
+                    b.ToTable("editions");
+                });
+
+            modelBuilder.Entity("Internship.Core.Intern", b =>
+                {
+                    b.Property<string>("AlbumNumber")
+                        .HasColumnName("album_number")
+                        .HasColumnType("text");
+
+                    b.Property<int?>("CourseId")
+                        .HasColumnName("course_id")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Email")
+                        .HasColumnName("email")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Semester")
+                        .HasColumnName("semester")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Surname")
+                        .HasColumnName("surname")
+                        .HasColumnType("text");
+
+                    b.HasKey("AlbumNumber")
+                        .HasName("pk_interns");
+
+                    b.HasIndex("CourseId")
+                        .HasName("ix_interns_course_id");
+
+                    b.ToTable("interns");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipEntity", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("BranchOfficeId")
+                        .HasColumnName("branch_office_id")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("EditionId")
+                        .HasColumnName("edition_id")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnName("end_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<float>("Grade")
+                        .HasColumnName("grade")
+                        .HasColumnType("real");
+
+                    b.Property<string>("InternAlbumNumber")
+                        .HasColumnName("intern_album_number")
+                        .HasColumnType("text");
+
+                    b.Property<int>("InternshipLengthInWeeks")
+                        .HasColumnName("internship_length_in_weeks")
+                        .HasColumnType("integer");
+
+                    b.Property<bool>("IsAccepted")
+                        .HasColumnName("is_accepted")
+                        .HasColumnType("boolean");
+
+                    b.Property<int?>("ReportId")
+                        .HasColumnName("report_id")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnName("start_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("Type")
+                        .HasColumnName("type")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_internships");
+
+                    b.HasIndex("BranchOfficeId")
+                        .HasName("ix_internships_branch_office_id");
+
+                    b.HasIndex("EditionId")
+                        .HasName("ix_internships_edition_id");
+
+                    b.HasIndex("InternAlbumNumber")
+                        .HasName("ix_internships_intern_album_number");
+
+                    b.HasIndex("ReportId")
+                        .HasName("ix_internships_report_id");
+
+                    b.ToTable("internships");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipProgramSubject", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("CourseId")
+                        .HasColumnName("course_id")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Description")
+                        .HasColumnName("description")
+                        .HasColumnType("text");
+
+                    b.Property<int?>("EditionId")
+                        .HasColumnName("edition_id")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("InternshipEntityId")
+                        .HasColumnName("internship_entity_id")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_internship_program_subject");
+
+                    b.HasIndex("CourseId")
+                        .HasName("ix_internship_program_subject_course_id");
+
+                    b.HasIndex("EditionId")
+                        .HasName("ix_internship_program_subject_edition_id");
+
+                    b.HasIndex("InternshipEntityId")
+                        .HasName("ix_internship_program_subject_internship_entity_id");
+
+                    b.ToTable("internship_program_subject");
+                });
+
+            modelBuilder.Entity("Internship.Core.Report", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.HasKey("Id")
+                        .HasName("pk_reports");
+
+                    b.ToTable("reports");
+                });
+
+            modelBuilder.Entity("Internship.Core.BranchOffice", b =>
+                {
+                    b.HasOne("Internship.Core.Company", "Company")
+                        .WithMany("Branches")
+                        .HasForeignKey("CompanyNip")
+                        .HasConstraintName("fk_branch_office_companies_company_nip");
+
+                    b.OwnsOne("Internship.Core.Address", "Address", b1 =>
+                        {
+                            b1.Property<int>("BranchOfficeId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<string>("Building")
+                                .HasColumnName("building")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("City")
+                                .HasColumnName("city")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("Country")
+                                .HasColumnName("country")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("PostalCode")
+                                .HasColumnName("postal_code")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("Street")
+                                .HasColumnName("street")
+                                .HasColumnType("text");
+
+                            b1.HasKey("BranchOfficeId")
+                                .HasName("pk_branch_office");
+
+                            b1.ToTable("branch_office");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BranchOfficeId")
+                                .HasConstraintName("fk_address_branch_office_branch_office_id");
+                        });
+                });
+
+            modelBuilder.Entity("Internship.Core.Intern", b =>
+                {
+                    b.HasOne("Internship.Core.Course", "Course")
+                        .WithMany()
+                        .HasForeignKey("CourseId")
+                        .HasConstraintName("fk_interns_course_course_id");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipEntity", b =>
+                {
+                    b.HasOne("Internship.Core.BranchOffice", "BranchOffice")
+                        .WithMany()
+                        .HasForeignKey("BranchOfficeId")
+                        .HasConstraintName("fk_internships_branch_office_branch_office_id");
+
+                    b.HasOne("Internship.Core.Edition", "Edition")
+                        .WithMany()
+                        .HasForeignKey("EditionId")
+                        .HasConstraintName("fk_internships_editions_edition_id");
+
+                    b.HasOne("Internship.Core.Intern", "Intern")
+                        .WithMany()
+                        .HasForeignKey("InternAlbumNumber")
+                        .HasConstraintName("fk_internships_interns_intern_album_number");
+
+                    b.HasOne("Internship.Core.Report", "Report")
+                        .WithMany()
+                        .HasForeignKey("ReportId")
+                        .HasConstraintName("fk_internships_reports_report_id");
+
+                    b.OwnsOne("Internship.Core.DeanAcceptance", "DeanAcceptance", b1 =>
+                        {
+                            b1.Property<int>("InternshipEntityId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<DateTime>("AcceptanceDate")
+                                .HasColumnName("acceptance_date")
+                                .HasColumnType("timestamp without time zone");
+
+                            b1.Property<bool>("IsDeansAcceptanceRequired")
+                                .HasColumnName("is_deans_acceptance_required")
+                                .HasColumnType("boolean");
+
+                            b1.Property<int>("Reason")
+                                .HasColumnName("reason")
+                                .HasColumnType("integer");
+
+                            b1.HasKey("InternshipEntityId")
+                                .HasName("pk_internships");
+
+                            b1.ToTable("internships");
+
+                            b1.WithOwner()
+                                .HasForeignKey("InternshipEntityId")
+                                .HasConstraintName("fk_dean_acceptance_internships_internship_entity_id");
+                        });
+
+                    b.OwnsOne("Internship.Core.Insurance", "Insurance", b1 =>
+                        {
+                            b1.Property<int>("InternshipEntityId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<DateTime>("InsuranceDeliveryDate")
+                                .HasColumnName("insurance_delivery_date")
+                                .HasColumnType("timestamp without time zone");
+
+                            b1.Property<bool>("IsInsuranceRequired")
+                                .HasColumnName("is_insurance_required")
+                                .HasColumnType("boolean");
+
+                            b1.HasKey("InternshipEntityId")
+                                .HasName("pk_internships");
+
+                            b1.ToTable("internships");
+
+                            b1.WithOwner()
+                                .HasForeignKey("InternshipEntityId")
+                                .HasConstraintName("fk_insurance_internships_internship_entity_id");
+                        });
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipProgramSubject", b =>
+                {
+                    b.HasOne("Internship.Core.Course", "Course")
+                        .WithMany()
+                        .HasForeignKey("CourseId")
+                        .HasConstraintName("fk_internship_program_subject_course_course_id");
+
+                    b.HasOne("Internship.Core.Edition", null)
+                        .WithMany("Subjects")
+                        .HasForeignKey("EditionId")
+                        .HasConstraintName("fk_internship_program_subject_editions_edition_id");
+
+                    b.HasOne("Internship.Core.InternshipEntity", null)
+                        .WithMany("Program")
+                        .HasForeignKey("InternshipEntityId")
+                        .HasConstraintName("fk_internship_program_subject_internships_internship_entity_id");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/src/Internship.Repository/Migrations/20200612141652_InitialCreate.cs b/src/Internship.Repository/Migrations/20200612141652_InitialCreate.cs
new file mode 100644
index 0000000..3c21540
--- /dev/null
+++ b/src/Internship.Repository/Migrations/20200612141652_InitialCreate.cs
@@ -0,0 +1,271 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace Internship.Repository.Migrations
+{
+    public partial class InitialCreate : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "companies",
+                columns: table => new
+                {
+                    nip = table.Column<string>(nullable: false),
+                    name = table.Column<string>(nullable: true),
+                    range = table.Column<int>(nullable: false),
+                    site_address = table.Column<string>(nullable: true),
+                    provider = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_companies", x => x.nip);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "course",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    name = table.Column<string>(nullable: true)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_course", x => x.id);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "editions",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    start_date = table.Column<DateTime>(nullable: false),
+                    end_date = table.Column<DateTime>(nullable: false),
+                    ipp_deadline_date = table.Column<DateTime>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_editions", x => x.id);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "reports",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_reports", x => x.id);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "branch_office",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    street = table.Column<string>(nullable: true),
+                    building = table.Column<string>(nullable: true),
+                    city = table.Column<string>(nullable: true),
+                    postal_code = table.Column<string>(nullable: true),
+                    country = table.Column<string>(nullable: true),
+                    company_nip = table.Column<string>(nullable: true),
+                    provider = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_branch_office", x => x.id);
+                    table.ForeignKey(
+                        name: "fk_branch_office_companies_company_nip",
+                        column: x => x.company_nip,
+                        principalTable: "companies",
+                        principalColumn: "nip",
+                        onDelete: ReferentialAction.Restrict);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "interns",
+                columns: table => new
+                {
+                    album_number = table.Column<string>(nullable: false),
+                    name = table.Column<string>(nullable: true),
+                    surname = table.Column<string>(nullable: true),
+                    email = table.Column<string>(nullable: true),
+                    course_id = table.Column<int>(nullable: true),
+                    semester = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_interns", x => x.album_number);
+                    table.ForeignKey(
+                        name: "fk_interns_course_course_id",
+                        column: x => x.course_id,
+                        principalTable: "course",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "internships",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    intern_album_number = table.Column<string>(nullable: true),
+                    edition_id = table.Column<int>(nullable: true),
+                    report_id = table.Column<int>(nullable: true),
+                    branch_office_id = table.Column<int>(nullable: true),
+                    type = table.Column<int>(nullable: false),
+                    start_date = table.Column<DateTime>(nullable: false),
+                    end_date = table.Column<DateTime>(nullable: false),
+                    is_accepted = table.Column<bool>(nullable: false),
+                    acceptance_date = table.Column<DateTime>(nullable: true),
+                    is_deans_acceptance_required = table.Column<bool>(nullable: true),
+                    reason = table.Column<int>(nullable: true),
+                    insurance_delivery_date = table.Column<DateTime>(nullable: true),
+                    is_insurance_required = table.Column<bool>(nullable: true),
+                    internship_length_in_weeks = table.Column<int>(nullable: false),
+                    grade = table.Column<float>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_internships", x => x.id);
+                    table.ForeignKey(
+                        name: "fk_internships_branch_office_branch_office_id",
+                        column: x => x.branch_office_id,
+                        principalTable: "branch_office",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                    table.ForeignKey(
+                        name: "fk_internships_editions_edition_id",
+                        column: x => x.edition_id,
+                        principalTable: "editions",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                    table.ForeignKey(
+                        name: "fk_internships_interns_intern_album_number",
+                        column: x => x.intern_album_number,
+                        principalTable: "interns",
+                        principalColumn: "album_number",
+                        onDelete: ReferentialAction.Restrict);
+                    table.ForeignKey(
+                        name: "fk_internships_reports_report_id",
+                        column: x => x.report_id,
+                        principalTable: "reports",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "internship_program_subject",
+                columns: table => new
+                {
+                    id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    course_id = table.Column<int>(nullable: true),
+                    description = table.Column<string>(nullable: true),
+                    edition_id = table.Column<int>(nullable: true),
+                    internship_entity_id = table.Column<int>(nullable: true)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("pk_internship_program_subject", x => x.id);
+                    table.ForeignKey(
+                        name: "fk_internship_program_subject_course_course_id",
+                        column: x => x.course_id,
+                        principalTable: "course",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                    table.ForeignKey(
+                        name: "fk_internship_program_subject_editions_edition_id",
+                        column: x => x.edition_id,
+                        principalTable: "editions",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                    table.ForeignKey(
+                        name: "fk_internship_program_subject_internships_internship_entity_id",
+                        column: x => x.internship_entity_id,
+                        principalTable: "internships",
+                        principalColumn: "id",
+                        onDelete: ReferentialAction.Restrict);
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "ix_branch_office_company_nip",
+                table: "branch_office",
+                column: "company_nip");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_interns_course_id",
+                table: "interns",
+                column: "course_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internship_program_subject_course_id",
+                table: "internship_program_subject",
+                column: "course_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internship_program_subject_edition_id",
+                table: "internship_program_subject",
+                column: "edition_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internship_program_subject_internship_entity_id",
+                table: "internship_program_subject",
+                column: "internship_entity_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internships_branch_office_id",
+                table: "internships",
+                column: "branch_office_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internships_edition_id",
+                table: "internships",
+                column: "edition_id");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internships_intern_album_number",
+                table: "internships",
+                column: "intern_album_number");
+
+            migrationBuilder.CreateIndex(
+                name: "ix_internships_report_id",
+                table: "internships",
+                column: "report_id");
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "internship_program_subject");
+
+            migrationBuilder.DropTable(
+                name: "internships");
+
+            migrationBuilder.DropTable(
+                name: "branch_office");
+
+            migrationBuilder.DropTable(
+                name: "editions");
+
+            migrationBuilder.DropTable(
+                name: "interns");
+
+            migrationBuilder.DropTable(
+                name: "reports");
+
+            migrationBuilder.DropTable(
+                name: "companies");
+
+            migrationBuilder.DropTable(
+                name: "course");
+        }
+    }
+}
diff --git a/src/Internship.Repository/Migrations/InternshipDbContextModelSnapshot.cs b/src/Internship.Repository/Migrations/InternshipDbContextModelSnapshot.cs
new file mode 100644
index 0000000..ef5df0a
--- /dev/null
+++ b/src/Internship.Repository/Migrations/InternshipDbContextModelSnapshot.cs
@@ -0,0 +1,426 @@
+// <auto-generated />
+using System;
+using Internship.Repository;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace Internship.Repository.Migrations
+{
+    [DbContext(typeof(InternshipDbContext))]
+    partial class InternshipDbContextModelSnapshot : ModelSnapshot
+    {
+        protected override void BuildModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
+                .HasAnnotation("ProductVersion", "3.1.5")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            modelBuilder.Entity("Internship.Core.BranchOffice", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("CompanyNip")
+                        .HasColumnName("company_nip")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Provider")
+                        .HasColumnName("provider")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_branch_office");
+
+                    b.HasIndex("CompanyNip")
+                        .HasName("ix_branch_office_company_nip");
+
+                    b.ToTable("branch_office");
+                });
+
+            modelBuilder.Entity("Internship.Core.Company", b =>
+                {
+                    b.Property<string>("Nip")
+                        .HasColumnName("nip")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Provider")
+                        .HasColumnName("provider")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Range")
+                        .HasColumnName("range")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("SiteAddress")
+                        .HasColumnName("site_address")
+                        .HasColumnType("text");
+
+                    b.HasKey("Nip")
+                        .HasName("pk_companies");
+
+                    b.ToTable("companies");
+                });
+
+            modelBuilder.Entity("Internship.Core.Course", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.HasKey("Id")
+                        .HasName("pk_course");
+
+                    b.ToTable("course");
+                });
+
+            modelBuilder.Entity("Internship.Core.Edition", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnName("end_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<DateTime>("IPPDeadlineDate")
+                        .HasColumnName("ipp_deadline_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnName("start_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.HasKey("Id")
+                        .HasName("pk_editions");
+
+                    b.ToTable("editions");
+                });
+
+            modelBuilder.Entity("Internship.Core.Intern", b =>
+                {
+                    b.Property<string>("AlbumNumber")
+                        .HasColumnName("album_number")
+                        .HasColumnType("text");
+
+                    b.Property<int?>("CourseId")
+                        .HasColumnName("course_id")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Email")
+                        .HasColumnName("email")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .HasColumnName("name")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Semester")
+                        .HasColumnName("semester")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Surname")
+                        .HasColumnName("surname")
+                        .HasColumnType("text");
+
+                    b.HasKey("AlbumNumber")
+                        .HasName("pk_interns");
+
+                    b.HasIndex("CourseId")
+                        .HasName("ix_interns_course_id");
+
+                    b.ToTable("interns");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipEntity", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("BranchOfficeId")
+                        .HasColumnName("branch_office_id")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("EditionId")
+                        .HasColumnName("edition_id")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnName("end_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<float>("Grade")
+                        .HasColumnName("grade")
+                        .HasColumnType("real");
+
+                    b.Property<string>("InternAlbumNumber")
+                        .HasColumnName("intern_album_number")
+                        .HasColumnType("text");
+
+                    b.Property<int>("InternshipLengthInWeeks")
+                        .HasColumnName("internship_length_in_weeks")
+                        .HasColumnType("integer");
+
+                    b.Property<bool>("IsAccepted")
+                        .HasColumnName("is_accepted")
+                        .HasColumnType("boolean");
+
+                    b.Property<int?>("ReportId")
+                        .HasColumnName("report_id")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnName("start_date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("Type")
+                        .HasColumnName("type")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_internships");
+
+                    b.HasIndex("BranchOfficeId")
+                        .HasName("ix_internships_branch_office_id");
+
+                    b.HasIndex("EditionId")
+                        .HasName("ix_internships_edition_id");
+
+                    b.HasIndex("InternAlbumNumber")
+                        .HasName("ix_internships_intern_album_number");
+
+                    b.HasIndex("ReportId")
+                        .HasName("ix_internships_report_id");
+
+                    b.ToTable("internships");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipProgramSubject", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("CourseId")
+                        .HasColumnName("course_id")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Description")
+                        .HasColumnName("description")
+                        .HasColumnType("text");
+
+                    b.Property<int?>("EditionId")
+                        .HasColumnName("edition_id")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("InternshipEntityId")
+                        .HasColumnName("internship_entity_id")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id")
+                        .HasName("pk_internship_program_subject");
+
+                    b.HasIndex("CourseId")
+                        .HasName("ix_internship_program_subject_course_id");
+
+                    b.HasIndex("EditionId")
+                        .HasName("ix_internship_program_subject_edition_id");
+
+                    b.HasIndex("InternshipEntityId")
+                        .HasName("ix_internship_program_subject_internship_entity_id");
+
+                    b.ToTable("internship_program_subject");
+                });
+
+            modelBuilder.Entity("Internship.Core.Report", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnName("id")
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.HasKey("Id")
+                        .HasName("pk_reports");
+
+                    b.ToTable("reports");
+                });
+
+            modelBuilder.Entity("Internship.Core.BranchOffice", b =>
+                {
+                    b.HasOne("Internship.Core.Company", "Company")
+                        .WithMany("Branches")
+                        .HasForeignKey("CompanyNip")
+                        .HasConstraintName("fk_branch_office_companies_company_nip");
+
+                    b.OwnsOne("Internship.Core.Address", "Address", b1 =>
+                        {
+                            b1.Property<int>("BranchOfficeId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<string>("Building")
+                                .HasColumnName("building")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("City")
+                                .HasColumnName("city")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("Country")
+                                .HasColumnName("country")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("PostalCode")
+                                .HasColumnName("postal_code")
+                                .HasColumnType("text");
+
+                            b1.Property<string>("Street")
+                                .HasColumnName("street")
+                                .HasColumnType("text");
+
+                            b1.HasKey("BranchOfficeId")
+                                .HasName("pk_branch_office");
+
+                            b1.ToTable("branch_office");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BranchOfficeId")
+                                .HasConstraintName("fk_address_branch_office_branch_office_id");
+                        });
+                });
+
+            modelBuilder.Entity("Internship.Core.Intern", b =>
+                {
+                    b.HasOne("Internship.Core.Course", "Course")
+                        .WithMany()
+                        .HasForeignKey("CourseId")
+                        .HasConstraintName("fk_interns_course_course_id");
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipEntity", b =>
+                {
+                    b.HasOne("Internship.Core.BranchOffice", "BranchOffice")
+                        .WithMany()
+                        .HasForeignKey("BranchOfficeId")
+                        .HasConstraintName("fk_internships_branch_office_branch_office_id");
+
+                    b.HasOne("Internship.Core.Edition", "Edition")
+                        .WithMany()
+                        .HasForeignKey("EditionId")
+                        .HasConstraintName("fk_internships_editions_edition_id");
+
+                    b.HasOne("Internship.Core.Intern", "Intern")
+                        .WithMany()
+                        .HasForeignKey("InternAlbumNumber")
+                        .HasConstraintName("fk_internships_interns_intern_album_number");
+
+                    b.HasOne("Internship.Core.Report", "Report")
+                        .WithMany()
+                        .HasForeignKey("ReportId")
+                        .HasConstraintName("fk_internships_reports_report_id");
+
+                    b.OwnsOne("Internship.Core.DeanAcceptance", "DeanAcceptance", b1 =>
+                        {
+                            b1.Property<int>("InternshipEntityId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<DateTime>("AcceptanceDate")
+                                .HasColumnName("acceptance_date")
+                                .HasColumnType("timestamp without time zone");
+
+                            b1.Property<bool>("IsDeansAcceptanceRequired")
+                                .HasColumnName("is_deans_acceptance_required")
+                                .HasColumnType("boolean");
+
+                            b1.Property<int>("Reason")
+                                .HasColumnName("reason")
+                                .HasColumnType("integer");
+
+                            b1.HasKey("InternshipEntityId")
+                                .HasName("pk_internships");
+
+                            b1.ToTable("internships");
+
+                            b1.WithOwner()
+                                .HasForeignKey("InternshipEntityId")
+                                .HasConstraintName("fk_dean_acceptance_internships_internship_entity_id");
+                        });
+
+                    b.OwnsOne("Internship.Core.Insurance", "Insurance", b1 =>
+                        {
+                            b1.Property<int>("InternshipEntityId")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnName("id")
+                                .HasColumnType("integer")
+                                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                            b1.Property<DateTime>("InsuranceDeliveryDate")
+                                .HasColumnName("insurance_delivery_date")
+                                .HasColumnType("timestamp without time zone");
+
+                            b1.Property<bool>("IsInsuranceRequired")
+                                .HasColumnName("is_insurance_required")
+                                .HasColumnType("boolean");
+
+                            b1.HasKey("InternshipEntityId")
+                                .HasName("pk_internships");
+
+                            b1.ToTable("internships");
+
+                            b1.WithOwner()
+                                .HasForeignKey("InternshipEntityId")
+                                .HasConstraintName("fk_insurance_internships_internship_entity_id");
+                        });
+                });
+
+            modelBuilder.Entity("Internship.Core.InternshipProgramSubject", b =>
+                {
+                    b.HasOne("Internship.Core.Course", "Course")
+                        .WithMany()
+                        .HasForeignKey("CourseId")
+                        .HasConstraintName("fk_internship_program_subject_course_course_id");
+
+                    b.HasOne("Internship.Core.Edition", null)
+                        .WithMany("Subjects")
+                        .HasForeignKey("EditionId")
+                        .HasConstraintName("fk_internship_program_subject_editions_edition_id");
+
+                    b.HasOne("Internship.Core.InternshipEntity", null)
+                        .WithMany("Program")
+                        .HasForeignKey("InternshipEntityId")
+                        .HasConstraintName("fk_internship_program_subject_internships_internship_entity_id");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
-- 
2.45.2