EF4 Сокрытие / Подмена базовых полей - PullRequest
1 голос
/ 27 сентября 2011

У меня есть такая модель данных в SQL Server:

table Note
- varchar NoteText
- tinyint PriorityLevel

В моем коде Entity Framework превращает ее в класс, подобный:

class Note
- string NoteText
- byte PriorityLevel

Также в коде, который у меня естьперечисление PriorityLevel, которое делает мой код более читабельным:

public enum PriorityEnum : byte
{
    NORMAL = 10,
    IMPORTANT = 20,
    URGENT = 30
}

Итак, я хотел бы использовать это перечисление непосредственно с моими объектами Note, такими как myNote.PriorityLevel = PriorityEnum.NORMAL, вместо того, чтобы постоянно выполнять приведение типа myNote.PriorityLevel = (byte)PriorityEnum.NORMAL.

У меня уже есть решение с использованием объявления класса Partial, но я получаю два свойства с одинаковыми именами, которые отображаются на базовый PriorityLevel, что является беспорядочным:

class Note
- string NoteText
- byte PriorityLevel
- PriorityEnum PriorityLevelEnum (gets/sets PriorityLevel)

Естественно, я хотел бы, чтобы мой класс EF определялся просто следующим образом:

class Note
- string NoteText
- PriorityEnum PriorityLevel

FYI Я использую генерацию POCO моих классов сущностей EF, поэтому я полагаю, что решение может включать изменение в шаблонах T4, которыегенерировать их, но я обеспокоен тем, что упускаю что-то простое.Я думаю, что может быть решение путем изменения определений полей в конструкторе EDMX, но я беспокоюсь, что они могут быть перезаписаны в следующий раз, когда я обновлю EDMX из определения базы данных.

1 Ответ

2 голосов
/ 27 сентября 2011

В текущей версии платформы сущностей вам всегда понадобятся оба свойства, потому что EF не может автоматически преобразовывать перечисления и использовать их при отображении (это изменится в будущей версии ).

Таким образом, ваша сущность, определенная в EDMX, должна иметь свойство байта, а ваш частичный класс должен предоставить второе свойство, используя перечисление, и выполнить внутреннее преобразование в байт в методах получения и установки.Что вы можете сделать, это уменьшить доступность вашего прежнего сопоставленного свойства.Недостатком этого сценария является то, что запросы Linq-to-entity не могут использовать ваше свойство enum - они должны использовать исходное свойство байта, а код, определяющий запросы, должен иметь доступ к этому свойству.

Изменение шаблона для создания свойств перечисления длявам было бы не так просто, потому что шаблону нужна некоторая информация, чтобы отличаться между стандартным свойством байта и свойством enum like.Вы можете использовать некоторые соглашения об именах для вывода перечислений, но если вам действительно нравится универсальное решение, вы должны вручную изменить EDMX и использовать структурные аннотации , чтобы сообщить шаблону T4, какой тип перечисления следует использовать для связанного свойства.

...