У нас есть EF4 EDMX, который содержит ~ 300 сущностей, которые используются в нашем основном наборе продуктов (сущности, импортированные из базы данных).
Когда мы получаем новых клиентов, они чаще всего хотят хранить дополнительную информациюи мы разрабатываем нестандартные процессы, которые находятся за пределами нашей бизнес-сферы и полностью индивидуальны.Например, мы заключили договор с охранной компанией, и они хотели хранить информацию об их уровнях безопасности и иметь процессы, которые действуют на этих уровнях.
В каждом случае нам нужно добавлять пользовательские таблицы И / ИЛИ добавлять настраиваемые поля всуществующие объекты.У нас был хороший способ сделать это с предыдущей технологией, в которой библиотеки базовых классов не были объединены с пользовательскими таблицами и т. Д. Мы просто унаследовали базовую сущность (эквивалентную EntityObject в EF) в пользовательской библиотеке классов и добавили настройки по мере необходимости.
Точно так же мы не хотим добавлять эти пользовательские таблицы и атрибуты в наше ядро EDMX.Мы хотим «наследовать» ядро EDMX в новом пользовательском EDMX в отдельной библиотеке классов, в которую мы можем добавить настройки.Наследование позволит нам сделать все возможное в Core EDMX, а также немного больше.
Мы используем шаблон t4 для генерации наших репозиториев на основе этого сообщения в блоге (мы не используем подход, основанный на модели):
http://geekswithblogs.net/danemorgridge/archive/2010/06/28/entity-framework-repository-amp-unit-of-work-t4-template-on.aspx
Можем ли мы расширить EDMX так, как нам нужно?
Мы придумали одно хакерское решение - расширение метода для основных объектов, которое возвращает пользовательский объект вОтдельный EDMX, как показано ниже:
public static class CoreEntityExtensions
{
public static EntityConnection EntityConnection;
public static CustomUserEntity CustomUserDetails(this User coreUser)
{
ICustomUserEntityRepository customUserRepository = new CustomUserEntityRepository(EntityConnection);
return customUserRepository.All().SingleOrDefault(u => u.id == coreUser.id);
}
}
Это не идеально, хотя по нескольким очевидным причинам.
Любая помощь очень ценится.