Set AttachDbFilename as Relative Path in .NET Core
.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.