Использование шаблонов T4 для добавления пользовательского кода в объекты EF4? - PullRequest
2 голосов
/ 18 марта 2010

Я начинаю работать с Entity Framework 4, используя разработку на основе модели. Я строю простое демонстрационное приложение WPF, чтобы изучить фреймворк. Мое приложение состоит из двух объектов: Тема и Примечание. Тема - это тема обсуждения; у него есть свойства Title, Text и DateRevised. Тема также имеет свойство коллекции Notes. примечание имеет свойства DateCreated и Text.

Я использовал EF4 для создания EDM и хранилища данных для приложения. Теперь мне нужно добавить немного интеллекта к сущностям. Например, установщик свойства для свойства Topic.Text должен обновить свойство Topic.DateRevised, а Note должен установить свое свойство DateCreated при его создании - довольно простые вещи. Я предполагаю, что не могу изменить сгенерированные классы напрямую, потому что мой код был бы потерян, если сущности были повторно сгенерированы.

Это то, что я могу реализовать, изменив шаблон T4, который EF4 использует для генерации сущностей? Другими словами, можно ли изменить шаблон T4, чтобы добавить мой код для выполнения этих задач в объекты, которые он генерирует? Можете ли вы отослать меня к хорошему учебнику или объяснению, как начать?

Большая часть того, что я нашел до сих пор, говорит о том, как добавить файл tt в EDM, чтобы я мог это сделать. То, что я ищу, - это ресурс, который я могу использовать для перехода на следующий уровень, предполагая, что шаблон T4 можно использовать для настройки сгенерированных объектов, как я описал. Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 18 марта 2010

Вы можете сделать это без T4, используя частичные классы и частичные методы.

Каждое свойство EF будет иметь частичный метод OnPropertyNameChanged. Если вы реализуете это в частичном классе, вы можете добавить необходимое поведение, и вы не потеряете свои изменения при обновлении.

Итак, вы бы добавили новый файл, скажем, Topic.cs. Там вы бы написали:

namespace MyNamespace
{
    public partial class Topic 
    {
        partial void OnTextChanged()
        {
            this.DateRevised = DateTime.Now;
        }
    }
}
...