Entity Framework 4 - встроить ссылку ObjectContext в сгенерированные объекты - PullRequest
0 голосов
/ 19 августа 2011

Я новичок в Entity Framework 4.0, использую его с C # и в настоящее время экспериментирую с его функциями.

Что я заметил, так это то, что, как и в большинстве подобных ORM, он использует объект Context для работы сманипулирование данными и генерация операторов CRUD для сгенерированных объектов.

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

Это нормально, и все, если контекст был создан в доступной области (такой же метод, например), но что если я передам сущность или набор сущностей методу ихотите этот метод сохранить изменения?Похоже, что единственный простой способ - передать ObjectContext вместе с параметрами.

Другое решение - поместить ObjectContext в какую-то глобальную переменную.Само собой разумеется, я нахожу проблемы стилевого оформления и удобства сопровождения для обоих этих подходов.

Короче говоря, лучший способ, который я могу себе представить, - это получить ссылку на ObjectContext из сущности или набора сущностей.Я знаю, что по умолчанию это невозможно.

Я нашел метод , показывающий добавление метода расширения для получения ObjectContext от объекта.Однако он работает только для сущностей со связями, и, по словам автора, вызов этого метода стоит дорого.

Я думал о том, возможно, изменить шаблон T4, чтобы добавить свойство Context ко всем моим сущностям и автоматически заполнить его для сущностей'instanciation.

Я уже однажды модифицировал шаблон T4, чтобы Entity Framework применяла максимальную длину в моих сгенерированных классах (следуя книге Джулии Лерман по программированию Entity Framework 4).Я не могу сказать, что мне действительно нравится синтаксис T4, но если это лучший / единственный способ, пусть будет так ...

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

Есть ли какие-либо серьезные недостатки в использовании такого подхода?Я думаю, что наличие такого большого количества ссылок на ObjectContext может помешать / отсрочить его возможность повторного выбора GC, если некоторые из моих сущностей остаются в области видимости, но я фактически больше не использую ObjectContext.

Большое спасибо.

1 Ответ

0 голосов
/ 19 августа 2011

Если вам нужно передать контекст объекта в качестве параметра вместе с вашими сущностями, вы делаете что-то не так.

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

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

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

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

...