Расширение сущностных классов

87

»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ

О частичных методах говорилось ранее, и вот мы добрались до ситуации, при которой такие методы чрезвычайно полезны. В Microsoft определили, когда в течение жизненного цикла сущностного класса разработчики наиболее вероятно заинтересованы в получении уведомлений, и добавили вызовы частичных методов. Ниже представлен список поддерживаемых частичных методов:

partial void OnLoaded();
partial void OnValidate(ChangeAction action); 
partial void OnCreated();
partial void On[Property]Changing([Type] value); 
partial void On[Property]Changed();

Последние два метода из этого списка получают имя, заменяя часть "[Property]" именем свойства, а часть "[Type]" — типом данных этого свойства. Чтобы продемонстрировать некоторые частичные методы, поддерживаемые сущностными классами, добавим к сущностному классу Contact следующий код:

namespace nwind
{
    public partial class Contact
    {
        partial void OnLoaded()
        {
            Console.WriteLine("Вызван OnLoaded()");
        }

        partial void OnCreated()
        {
            Console.WriteLine("Вызван OnCreated()");
        }

        partial void OnCompanyNameChanging(string value)
        {
            Console.WriteLine("Вызван OnCompanyNameChanging()");
        }

        partial void OnCompanyNameChanged()
        {
            Console.WriteLine("Вызван OnCompanyNameChanged().");
        }
    }
}

Обратите внимание на указание пространства имен nwind. Это необходимо, поскольку пространство имен для объявления класса должно совпадать с пространством имен расширяемого класса. Поскольку при генерации сущностного класса в SQLMetal указано пространство имен nwind, частичный класс Contact также должен быть объявлен в том же пространстве имен nwind. В реальном рабочем коде, скорее всего, для этого объявления частичного класса будет предусмотрен отдельный модуль.

Как видите, предоставлены простые реализации для методов OnLoaded, OnCreated, OnCompanyNameChanging и OnCompanyNameChanged, которые лишь выводят сообщения на консоль. Теперь давайте взглянем на некоторый код, демонстрирующий использование частичных методов. В примере ниже из базы данных запрашивается запись Contact и модифицируется ее свойство CompanyName:

// Используйте свое подключение
            Northwind db = new Northwind(
                     @"Data Source=MICROSOF-1EA29E\SQLEXPRESS;Initial Catalog=C:\NORTHWIND.MDF;Integrated Security=True");

            Contact contact = db.Contacts
                                .Where(c => c.ContactID == 11)
                                .SingleOrDefault();
            Console.WriteLine("CompanyName = {0}", contact.CompanyName);

            contact.CompanyName = "Joe's House of Booze";
            Console.WriteLine("CompanyName = {0}", contact.CompanyName);

В приведенном коде нет ничего особенного, за исключением реализации ряда частичных методов, поддерживаемых сущностными классами. Сначала запрашивается контакт и на консоль выводится название его компании. Затем название компании изменяется и снова выводится на консоль. Давайте посмотрим на вывод этого кода:

Запрос класса с помощью реализованных частичных методов

Как видите, сначала был вызван метод OnCreate, а после него — метод OnLoaded. В этой точке из базы данных была извлечена запись и загружена в сущностный объект Contact. На консоль было выведено наименование компании. Затем был вызван метод OnCompanyNameChanging, после которого, как ни удивительно, произошел еще один вызов OnCreate. Очевидно, что DataContext создает еще один сущностный объект Contact как часть процедуры отслеживания изменений. Далее вызывается метод OnCompanyNameChanged, за которым производится вывод нового имени компании на консоль.

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

Пройди тесты
Лучший чат для C# программистов