EF. Концепция использования
От: Аноним  
Дата: 01.10.10 12:32
Оценка:
Использую EF и POCO в своей поделке.

Для генерации POCO классов и класса DataContext использовал "ADO.NET c# POCO Entity Generator" здесь

Написал сервисы которые извлекают данные из базы и возвращают объекты. При этом я не храню объект DataContext (вроде как лучшая практика), т.е. после извлечения данных DataContext диспозится:

class PersonService {
public GetPerson(Guid ID) {
        using (DataContext ctx = new ...) {
                   // ...
                }
     }
 
}


Сами сервисы я тягаю в контроллере, в нем же (котроллере) храню загруженные объекты, обрабатываю их там, что бы потом сохранить. Еще раз: никакой ссылки на DataContext не храню, потому что использую сервисы по указанному выше сценарию.
Нарвался на проблему, что LazyLoad не работает с объектами, у которых DataContext уничтожен. Не беда, сразу гружу нужные данные: Include("..").
Теперь допустим у Person есть Nationality поле, которое я хочу обновить. Nationality соответствует одноименной таблице и находится в связи с Person. Если я меняю значение поля, вываливается ошибка в сгенерированном коде в методе FixupNationality, что DataContext уничтожен. Пока не делал но видимо придется создавать в сервисе метод вида

SetNationality (Person person, Nationality nationality) {
using (DataContext ctx = new ...) {
// a) приаттачить персону
// b) установить ему нацинальность
// c) в Client/Service сценарии пришлось бы наверное вернуть измененную персону
}
}

В общем вопросы следующего характера:
— нормально ли то что я работаю с POCO объктом без сохранения DataContexta
— нормально ли то что для изменения такого поля как Nationality я должен пересоздавать DataContext (ведь я же не использую DataContex при изменении например имени). Смущает концепция.
— может быть стоит отказаться от генерированных классов или модифицировать генерация, что бы исключить проверку консистенции данных
— может я вообще неправильно подошел и надо хранить ссылку на DataContext (правда тогда совершенно непонятно можно работать с ним в n-tier сценариях)

Спасибо за советы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.