我尝试在Visual Studio 2013中为EF Code-First上下文类创建项模板。除了我想要一个指向当前项目中的命名空间的using语句之外,我已经完成了所有工作。例如,在 ProjectName .Contexts中创建模板项的实例时,using语句将为:
使用 ProjectName .Models
问题在于我无法找到替换项目模板中的部件的方法。尽管我可以确定,$ projectname $和$ safeprojectname $仅适用于项目模板,而不适用于项目模板。
我的模板如下:
using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using $safeprojectname$.DAL.Models; // This is the problem line
namespace $rootnamespace$
{
public class $safeitemrootname$
: DbContext
{
// Constructors =======================================================
public $safeitemrootname$()
: base("$safeitemrootname$")
{
}
// DBSets =============================================================
// public DbSet<Company> Companies { get; set; }
// Configuration ======================================================
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}
更新
回应Hans的评论,当我尝试使用$ projectname $($ safeprojectname $做同样的事情)时,这里有输出:
using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using $projectname$.DAL.Models; // This is the problem line
如您所见,$ projectname $替换只会被忽略。
任何帮助将不胜感激,
杰森
答案 0 :(得分:2)
如以下MSDN链接中所述:
https://msdn.microsoft.com/en-us/library/eehb4faa.aspx
只有在“新建项目”对话框中提到项目名称时才会出现项目名称。因此,如果您在现有项目中使用它,它将无法工作。见下面的截图:
答案 1 :(得分:2)
在copyParameters="true"
中添加Root.vstemplate
,如下所示
ProjectTemplateLink ProjectName="Domain.$projectname$" CopyParameters="true">
在代码中使用$ext_projectname$
来解析项目名称
using Provider.$ext_projectname$
答案 2 :(得分:1)
我找到了一种解决方法 - 使用自定义模板向导,并在源代码管理资源管理器中检索当前选定的项目。
由于 CUSTOM 项目模板仅在解决方案树中选择项目节点时才能在“添加新”菜单中使用,因此可以确定项目名称(以及EnvDTE可用的所有其他信息)并添加到replacementmentsDictionary中。
using EnvDTE80;
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
//Adding by template is unavailable in the context menu when selecting more than one item -> use index 0.
UIHierarchyItem selectedUiHierarchyItem = (UIHierarchyItem )dte.ToolWindows.SolutionExplorer.SelectedItems[0];
//not null when selecting solution node (when adding a project)
Solution selectedSolution = selectedUiHierarchyItem.Object as Solution
//not null when selecting project node (when adding an item) or when selecting a solution folder (when adding a project)
Project selectedProject = selectedUiHierarchyItem.Object as Project;
//Determine which kind of project node:
if (selectedProject != null)
{
if (selectedProject.Kind == EnvDTE.Constants.vsProjectKindSolutionItems)
{
//solution folder
}
else
{
//project
replacementsDictionary.Add("$projectname$", selectedProject.Name);
}
}
}
答案 3 :(得分:1)
我的同事在工作中找到了一个修复它的参数来检测当前的项目名称。
$rootnamespace$