2015-12-18 3 views
2

У меня есть производный класс DbContext, чьи классы объектов-членов настроены с использованием Fluent API. Я хочу получить эти конфигурации и отношения программно. код для этого уже установлен, и я переношу его на шаблон T4 для генерации кода.Извлечение свободной конфигурации программно без создания экземпляра DbContext

В то время как большая часть генерации кода использует отражение, беглый конфигурация требует класс контекст быть создан для того, чтобы получить:

  • ObjectContext
  • EntityObjects
  • EntityContainer
  • EntitySets
  • Etcetera

Поскольку мы не используем атрибуты свойств, отражение не помогает.

Это нормально работает во время выполнения, но установление DbContext в шаблоне T4 вызывает всевозможные проблемы. Это иногда приводит к сбоям VS, дает странные ошибки, создает циклическую зависимость и т. Д.

Если я отлаживаю шаблон T4, он запускается без ошибок, но фоновый процесс блокирует проект, содержащий класс и сущности DbContext. Поэтому каждый раз, когда происходит изменение объектов, я должен перезапустить VS три раза, выполняя разные шаги. Тьфу!

Мне было интересно, есть ли способ получить метаданные/конфигурацию объекта без создания экземпляра класса контекста. Любые рекомендации будут оценены.

ответ

1

Ну, вам нужно загрузить контекст, потому что ему нужно позвонить по телефону OnModelBuilding(DbModelBuilder) хотя бы один раз, чтобы заняться его бизнесом; в противном случае нет модели для опроса.

Если вы хотите, вы можете хранить информацию в формате XML с помощью EdmxWriter;

public static string ToEdmx(this System.Data.Entity.DbContext context) 
    { 
     var sb = new StringBuilder(); 

     using (var textWriter = new StringWriter(sb)) 
     using (var xmlWriter = System.Xml.XmlWriter.Create(textWriter, new System.Xml.XmlWriterSettings { Indent = true, IndentChars = " " })) 
     { 
      System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(context, xmlWriter); 
      textWriter.Flush(); 
     } 

     return sb.ToString(); 
    } 

Это даст вам документ XML с моделью данных. Вероятно, вы можете сохранить это на диске в одном процессе и опросить этот файл в своем файле TT.

+0

Спасибо Стив. Это отличный совет. Я мог бы написать это в консольное приложение, назовите его как шаг после сборки в проекте уровня данных, а затем запускайте потребляющий T4. Хотя мне интересно, есть ли способ прочитать XML в какой-то объектной модели EF, а не напрямую обращаться к XML. –

+0

Может это? http://stackoverflow.com/questions/29768118/using-iedmmodel-to-resolve-entityset-name-into-entityname-products-product –

+0

Это потрясающий ответ, спасибо! В противном случае я был бы мозгом, который бы сам разбирал фактический код конфигурации, и это тоже без Рослина. : P –