Поколение T4: откуда извлекается VsNamespaceSuggestion()?

#c# #entity-framework #code-generation #t4

#c# #entity-framework #генерация кода #t4

Вопрос:

Кто-нибудь знает, где находится код в файле .tt.VsNamespaceSuggestion() получает свое пространство имен из?

У меня возникла проблема, из-за которой мне пришлось изменить пространство имен решения, и я клянусь, что я изменил его везде (имена папок, файлов, названия проектов, свойства проекта, информацию о сборке и т.д.). Но когда запускается файл .tt, он всегда помещает старое пространство имен обратно в сгенерированные классы. Мне сказали, что это происходит из модели EF, но я не вижу там ничего, что показывало бы пространство имен (ни в конструкторе / свойствах, ни при открытии файла .edmx в блокноте).

Есть мысли? Для взлома я просто переопределяю его в следующей строке с нужным мне пространством имен:

 string namespaceName = code.VsNamespaceSuggestion();
namespaceName = "Desired.Namespace"; //HACK:
  

Ответ №1:

Только что возникла именно эта проблема, и решение, которое я обнаружил, здесь не упоминалось, поэтому я подумал, что помогу всем, кто наткнулся на эту статью в поиске.

Щелкните файл генерации кода *.tt, который генерирует ваши объекты. На панели свойств установите для пространства имен пользовательского инструмента то пространство имен, которое вы хотели бы создать. Мой был пустым, поэтому T4 генерировал пространство имен из пространства имен проекта по умолчанию иерархия папок.

Ответ №2:

Узел T4 в Visual Studio извлекает это из пакета свойств CallContext, используя имя «NamespaceHint».

Это значение заполняется стандартным механизмом пользовательского инструмента T4 (SingleFileGenerator), использующим пространство имен по умолчанию, указанное для пользовательского инструмента, которое либо является производным от пространства имен проекта по умолчанию и пути от корня проекта к файлу tt, либо явно указано в таблице свойств ниже спецификации пользовательского инструмента (как говорит @mattkab в своем ответе)

Если вы используете службу T4 из code, вы можете заполнить это, настроив CallContext самостоятельно.

Ответ №3:

Просто измените свойства файлов *.tt, как показано на следующем рисунке, и они вступят в силу немедленно.:

Значение по умолчанию пустое

Ответ №4:

Я думаю, что я устранил проблему. Я перепроверил пространства имен всех проектов по умолчанию после комментария sra, просто чтобы убедиться, но все действительно было правильно.

«Найти все в файлах» ничего не дало. Я использовал небольшой бесплатный инструмент под названием Agent Ransack, и он нашел файл .csproj с тегом с именем , в котором было старое пространство имен. Я изменил это, и это то, что исправило это.

AR также обнаружил старое пространство имен в куче файлов bin / Debug (список файлов abosluteFileList и файлы кэша). Я удалил все эти файлы, чтобы они были восстановлены с новым пространством имен. Я понятия не имею, имело ли это какой-либо эффект.

AR также обнаружил экземпляры в моем файле .suo. Поскольку проблема, похоже, устранена, я не удалял этот файл (к сожалению, вы не можете редактировать его в блокноте).