Дополнительная проверка сгенерированных классов сущностей Linq

Мы используем sqlmetal для создания нашего DBML, запускаем его через преобразование, затем используем sql metal для создания классов DataContext — кроме того, я хочу автоматически генерировать некоторую проверку для сущностей на основе некоторых метаданных, которые мы храним в базе данных о каждая сущность и ее атрибуты. Например, если у объекта есть то, что я знаю как поле «EmailAddress» метатипа «Email», я хотел бы создать метод OnValidate для объекта электронной почты, чтобы проверить, соответствует ли он моему регулярному выражению. Это все прекрасно и денди, и я могу сделать это в другом файле:

public partial class MYENTITY
{
    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if(action != System.Data.Linq.ChangeAction.Delete)
        {
            //check the validity of my email field or anything else
        }
    }
}

Как я могу сделать это, по-прежнему предоставляя разработчикам, которые хотят использовать этот DataContext, возможность подключать свою собственную логику к методу OnValidate для этой сущности? В нашей ситуации это будет бизнес-логика, специфичная для разрабатываемого приложения. Дополнения, которые я описал выше, являются лишь мерами предосторожности, гарантирующими, что данные, поступающие в базу данных, соответствуют моим ожиданиям.

Спасибо за любую помощь. Новичок здесь, так что извиняюсь, если что-то не так.


person Mustafakidd    schedule 14.08.2009    source источник


Ответы (1)


Если я вас правильно понимаю, вы хотите иметь возможность динамически генерировать метод OnValidate в конкретном файле с использованием вашей метады, но при этом разрешить вашим разработчикам добавлять настройки в метод OnValidate? Одним из способов было бы сгенерировать код с использованием этого шаблона:

public partial class MYENTITY
{
    partial void OnValidateCustomization();

    public void OnValidate(System.Data.Linq.ChangeAction action)    
    {        
        if(action != System.Data.Linq.ChangeAction.Delete)        
        {            
            //hook for code generator
        }   
        OnValidateCustomization();
    }
}

И попросите ваших разработчиков в другом файле или в том же файле, в зависимости от того, как вы обрабатываете существующие файлы при создании файла динамического кода, реализовать метод OnValdateCustomization():

public partial class MYENTITY
{
    partial void OnValidateCustomization()
    {
         Console.WriteLine("I Worked.");
    }
}

Однако я делаю предположения о том, как вы динамически генерируете код. Не могли бы вы также поместить токены в сгенерированные файлы и разрешить модификацию файлов вместо того, чтобы просто копировать их, когда вы снова запускаете генератор динамического кода? То есть вы просто вставляете эти токены вместо замены всего файла? Аргх, это недостающие детали...

person Merritt    schedule 15.08.2009