Instead of manually running "Scaffold-DbContext" in package manager console and updating the DBContext (as per https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html), you can speed things up with a Gulp task.
You can create a Gulp task and use the "node-powershell" to quickly run the scaffold command in dotnet CLI and automatically remove the hardcoded connection string from the Context class.
The script below creates a Gulp task ("build-DbContext") that will:
- Get the database connection string from appsettings.json
- Delete any previously created database models
- Create new models and DbContext (called ProjectDbContext), by running the "dotnet ef dbcontext scaffold" command
- Replace the "OnConfiguring" method with a new constructor in the "ProjectDbContext" class
gulpfile.js (build-DbContext)
var gulp = require('gulp'); var fs = require('fs'); var shell = require('node-powershell'); var del = require('delete'); var change = require('gulp-change'); var savefile = require('gulp-savefile'); var _appSettingsPath = "./appsettings.json"; var _contextProvider = "Microsoft.EntityFrameworkCore.SqlServer" var _contextClass = "ProjectDbContext"; var _contextOutputDir = "Models"; gulp.task('build-DbContext', function () { ScaffoldDbContext(); }); //Get connection string from the appsettings file function GetConnectionString() { var _appsettingJSON = JSON.parse(fs.readFileSync(_appSettingsPath, "utf8").replace(/^\uFEFF/, '')); return _appsettingJSON.data.DefaultConnection; } function ScaffoldDbContext() { _defaultConnection = GetConnectionString(); //Clear out old models first del("models/**/*"); var _powerShell = new shell({ executionPolicy: 'Bypass', debugMsg: true }); _powerShell.addCommand('dotnet ef dbcontext scaffold "' + _defaultConnection + '" ' + _contextProvider + ' --context "' + _contextClass + '" --output-dir "' + _contextOutputDir + '" --data-annotations') .then(function () { return _powerShell.invoke(); }) .then(function (output) { console.log(output); _powerShell.dispose(); }) .then(function () { UpdateDbContext(); }) .catch(function (err) { console.log(err); _powerShell.dispose(); this.emit('end'); }); } function UpdateDbContext() { return gulp.src(_contextOutputDir + "/" + _contextClass + ".cs") .pipe(change(RemoveInlineContextConfig)) .pipe(savefile()); } function RemoveInlineContextConfig(content, done) { var _constructorMethod = "public " + _contextClass + "(DbContextOptions<" + _contextClass + "> options)\n: base(options)\n{ }"; //Replace the "OnConfiguring" method with new constructor var _newContent = content.replace(/protected.*OnConfiguring(((?!}).|[\r\n])*)}/g, _constructorMethod); done(null, _newContent); }
Project
A basic example project looks like:
appsettings.json
Make sure you have a connection string value such as "DefaultConnection":
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "data": { "DefaultConnection": "Server=.\\[INSTANCENAME];Database=[DATABASENAME];user id=[USERNAME];password=[PASSWORD];Trusted_Connection=True;" } }
package.json
Add the required Gulp dependencies:
{ "version": "1.0.0", "name": "avros-data", "private": true, "devDependencies": { "gulp": "3.9.1", "node-powershell": "2.0.2", "fs": "0.0.2", "delete": "0.3.2", "gulp-change": "1.0.0", "gulp-savefile" : "0.1.1" } }
project.json
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0", "Microsoft.EntityFrameworkCore": "1.0.0", "Microsoft.EntityFrameworkCore.Tools": { "version": "1.0.0-preview2-final", "imports": [ "portable-net45+win8+dnxcore50", "portable-net45+win8" ] }
"tools": { "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" },