2014-11-09 3 views
0

Я пытаюсь создать шаблон элемента в Visual Studio 2013 для класса контекста EF Code-First. У меня все работает, но я хочу, чтобы оператор using указывал на пространство имен в текущем проекте. Например, при создании экземпляра элемента шаблона в Projectname .Contexts что используя оператор будет:Шаблон элемента Visual Studio: Заменить с именем проекта

использованием 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>(); 
     } 
    } 
} 

Update:

В ответ на Ханса комментарий, вот выход, когда я пытаюсь использовать $ 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

Нет, это прекрасно работает в шаблоне товаров. Он заменяется значением пространства имен по умолчанию для проекта. Как указано в закладке Project + Properties, Application. –

ответ

1

Как упомянуто ниже MSDN ссылка:

https://msdn.microsoft.com/en-us/library/eehb4faa.aspx

Название проекта придет только тогда, когда вы упомянули имя проекта в Новом Диалоговое окно проекта. Итак, если вы используете его в существующем проекте, это не сработает. Смотрите скриншот ниже:

Safe Project Name

1

Я нашел обходной путь - с помощью пользовательского мастера шаблонов и retreiving выбранного элемента в элементе управления источником исследователя.

С CUSTOM шаблонов пунктов доступны только в «добавить новое» меню, когда узел проекта выбран в дереве решений, имя проекта (и все другие информации, имеющейся EnvDTE) может быть определены и добавлены к replacementsDictionary.

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); 
     } 
    } 
} 
+1

Это указывало мне в правильном направлении. Обратите внимание, что используемая переменная «dte» - это преобразование automationObject в DTE2, поэтому вам нужна ссылка на EnvDTE80 –

+0

. Спасибо, Педро. Я добавил использование сверху, чтобы сделать это более понятным. – Volkirith

0

Добавить copyParameters="true" в Root.vstemplate как ниже

ProjectTemplateLink ProjectName="Domain.$projectname$" CopyParameters="true"> 

Использование $ext_projectname$ в коде разрешить имя проекта

using Provider.$ext_projectname$ 
0

Мой коллега по работе был в состоянии найти параметр, чтобы исправить это, что определяет текущее название проекта.

$rootnamespace$ 
Смежные вопросы