Set AttachDbFilename as Relative Path in .NET Core

Raymond Tang Raymond Tang 0 6593 2.59 index 7/8/2018

.NET Framework, you can use |DataDirectory| to configure connection string when connecting to SQL Server database file via attach mode:

AttachDbFilename=|DataDirectory|\dbname.mdf

In .NET Core, you cannot directly set SQL Server Express connection string by using any tokens directly. There is a workaround that can be used to get it work.

Connection string configuration in appSetting.json

"ConnectionStrings": {      "KontextCoreConnection": "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=%CONTENTROOTPATH%\App_Data\kontext-docu.mdf;Integrated Security=True;Connect Timeout=30",      "KontextDocuConnection": "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=%CONTENTROOTPATH%\App_Data\kontext-docu.mdf;Integrated Security=True;Connect Timeout=30"    }

The above code snippet configures two connection strings with a token %CONTENTROOTPATH%.

Parse the tokens when reading connection strings

Based on the token used in the configurations, replace it with the actual content root path.

// Replace connection string tokens              var connStrCore = Configuration.GetConnectionString(Constants.KontextCoreConnectionName);              var connStrDocu = Configuration.GetConnectionString(Constants.KontextDocuConnectionName);              if (connStrCore.Contains(Constants.ContentRootPathToken))                  connStrCore = connStrCore.Replace(Constants.ContentRootPathToken, Env.ContentRootPath);              if (connStrDocu.Contains(Constants.ContentRootPathToken))                  connStrDocu = connStrDocu.Replace(Constants.ContentRootPathToken, Env.ContentRootPath);

// Add database context              services.AddDbContext<ApplicationDbContext>(options =>              {                  if (dbConfig.CoreDbType == DatabaseType.SQLite)                  {                      options.UseSqlite(connStrCore,                          b => b.MigrationsAssembly("Kontext.Docu.Web.Portals"));                  }                  else                  {                      options.UseSqlServer(connStrDocu,                          b => b.MigrationsAssembly("Kontext.Docu.Web.Portals"));                  }                  // Register context data models.                  options.UseContextProjectShared();              });

In Constants class, a static field is defined to indicate the replacement token.

public readonly static string ContentRootPathToken = "%CONTENTROOTPATH%";

Of course, you can change the value to any token you like as long as it is consistent with your configuration file.

dotnetcore lite-log

Join the Discussion

View or add your thoughts below

Comments