In Visual Web Developer Express 2008 the SubSonic ASP.NET MVC template doesn't seem to work with a new database I added. I removed the Chinook Database and created my own one. I understand the the .tt files in the Models folder are used to generate code, but they don't (despite changing the ConnectionStringName to what I set in the web.config)
Right clicking on each .tt file and selecting 'Run Custom Tool' does not generate anything, except an error message:
Cannot find custom tool 'TextTemplatingFileGenerator' on this system.
Where is that tool kept? There are .tt files in CodeTemplates, which are used when you create a new controller or view, so I assume there is a tool that does this.
Following along with Adam's comment, YOU CAN do this in VS Express, but there are changes required to the template as Adam suggested.
The Visual Studio requirement is only used to get the path to the active project, which is then used to find a web.config file and the app_data path. Since those values are generally known within a project, we can hardcode substitutes values
Update the _Settings.tt file like so:
...
const string ConnectionStringName="Chinook";
//Use this when not building inside visual studio standard or higher
//make sure to include the trailing backslash!
const string ProjectPathDefault="c:\\path\\to\\project\\";
...
public EnvDTE.Project GetCurrentProject() {
if (Host is IServiceProvider)
{
IServiceProvider hostServiceProvider = (IServiceProvider)Host;
if (hostServiceProvider == null)
throw new Exception("Host property returned unexpected value (null)");
EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
if (dte == null)
throw new Exception("Unable to retrieve EnvDTE.DTE");
Array activeSolutionProjects = (Array)dte.ActiveSolutionProjects;
if (activeSolutionProjects == null)
throw new Exception("DTE.ActiveSolutionProjects returned null");
EnvDTE.Project dteProject = (EnvDTE.Project)activeSolutionProjects.GetValue(0);
if (dteProject == null)
throw new Exception("DTE.ActiveSolutionProjects[0] returned null");
return dteProject;
}
return null;
}
...
public string GetConfigPath(){
EnvDTE.Project project = GetCurrentProject();
if (project != null)
{
foreach(EnvDTE.ProjectItem item in project.ProjectItems)
{
// if it is the configuration, then open it up
if(string.Compare(item.Name, "Web.config", true) == 0)
{
System.IO.FileInfo info =
new System.IO.FileInfo(project.FullName);
return info.Directory.FullName + "\\" + item.Name;
}
}
return "";
}
else
{
return ProjectPathDefault+"web.config";
}
}
public string GetDataDirectory(){
EnvDTE.Project project=GetCurrentProject();
if (project != null)
{
return System.IO.Path.GetDirectoryName(project.FileName)+"\\App_Data\\";
}
else
{
return ProjectPathDefault+"App_Data\\";
}
}
...
Then use the VS External Tools feature to set up a T4 tool (Tools->External Tools): Set these properties:
Click Ok and then execute the newly created tool from the Tools->External Tools menu.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With