From d726edb283c2db70da1046440d482a163c2a6559 Mon Sep 17 00:00:00 2001 From: Dillan Cagnetta Date: Fri, 30 Aug 2019 11:02:43 +0200 Subject: [PATCH] Added: section to EF core for postgresql Updated: regenerate initial migration --- .../Best-Practices/PostgreSQL-Integration.md | 34 +++++++++--------- .../postgresql-delete-initial-migrations.png | Bin 0 -> 10255 bytes .../images/postgresql-update-database.png | Bin 0 -> 5625 bytes docs/en/docs-nav.json | 8 ++++- 4 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 docs/en/Best-Practices/images/postgresql-delete-initial-migrations.png create mode 100644 docs/en/Best-Practices/images/postgresql-update-database.png diff --git a/docs/en/Best-Practices/PostgreSQL-Integration.md b/docs/en/Best-Practices/PostgreSQL-Integration.md index 82d3cc9421..77db54f957 100644 --- a/docs/en/Best-Practices/PostgreSQL-Integration.md +++ b/docs/en/Best-Practices/PostgreSQL-Integration.md @@ -36,26 +36,28 @@ public class Acme.BookStore.EntityFrameworkCoreModule : AbpModule } ```` -### EntityFrameworkCore.DbMigrations Project Update -- **Do** update to use PostgreSQL in `BookStoreMigrationsDbContextModelSnapshot.cs` - -import `Npgsql.EntityFrameworkCore.PostgreSQL.Metadata` by adding - -````C# -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -```` - -replace all references +### Update Connection String Settings +- **Do** Update the PostgreSQL connection string in all `appsettings.json` files. + +### Regenerate Initial igration & Update the Database +Open the **Package Manager Console (PMC)** (under the *Tools/Nuget Package Manager* menu), select the `Acme.BookStore.EntityFrameworkCore.DbMigrations` as the **default project** and execute the following command: +> Ensure your startup project is correcty set. + +#### Delete Existing Initial Migrations + +![postgresql-delete-initial-migrations](images/postgresql-delete-initial-migrations.png) + +Then create a new migration class inside the `Migrations` folder. + ```` -.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); +PM> Add-Migration Initial ```` - to +Then execute the `Update-Database` command to update the database schema: -````C# -.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn); +```` +PM> Update-Database ```` -### Update Connection String Settings -> Update the PostgreSQL connection string in all `appsettings.json` files +![postgresql-update-database](images/postgresql-update-database.png) diff --git a/docs/en/Best-Practices/images/postgresql-delete-initial-migrations.png b/docs/en/Best-Practices/images/postgresql-delete-initial-migrations.png new file mode 100644 index 0000000000000000000000000000000000000000..39d9e6dedf7545d7f88c024d4521132ee3410289 GIT binary patch literal 10255 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 asHJzxQB9P)&yWxCp(x91ysQDf4*fqV2II~E literal 0 HcmV?d00001 diff --git a/docs/en/Best-Practices/images/postgresql-update-database.png b/docs/en/Best-Practices/images/postgresql-update-database.png new file mode 100644 index 0000000000000000000000000000000000000000..02b61ef6a3a5edc0d4cebf7bb2a5a2442b9e71c9 GIT binary patch literal 5625 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 b<{