Я установил небольшое n-уровневое веб-приложение, используя MVP (Model View Presenter) во внешнем интерфейсе, службу WCF на внутреннем интерфейсе, которая связывается с BLL, а за ним - DAL, который связывается сEF4.0.Все это работает довольно хорошо, я создал несколько методов Get и Add, которые все работают.Теперь я хотел создать несколько методов обновления.Поскольку я использую Self-Tracking Entities (STE) EF4.0, я подумал, что все будет хорошо, и реализация будет довольно простой.
Это не так.При изменении моих элементов в веб-интерфейсе они сохраняют статус «Без изменений» при возвращении к WCF-сервису.Поскольку объект не изменяется, в базе данных ничего не обновляется.В связи с этим вопросом о SO: EF 4 Self Tracking Entities не работает должным образом Я натолкнулся на статью, рассказывающую более подробно о реализации STE в n-уровневом приложении.(http://msdn.microsoft.com/en-us/magazine/ee335715.aspx) Я цитирую:
Убедитесь, что повторно используете сгенерированный код сущности шаблона Self-Tracking Entity на своем клиенте. Если вы используете прокси-код, сгенерированный AddСправочник по сервисам в Visual Studio или каком-либо другом инструменте, по большей части выглядит правильно, но вы обнаружите, что сущности на самом деле не отслеживают свои изменения на клиенте.
Ну, яМне удалось создать клиента для службы с помощью этого кода:
var svc = new ChannelFactory<INorthwindSTEService>(
"INorthwindSTEService")
.CreateChannel();
Это выглядит вполне нормально. Дело в том, как получить сериализованные сущности на клиенте? В примере кода IЯ вижу, что писатель использует этот код:
var products = new List<Product>(svc.GetProducts());
var customer = svc.GetCustomer("ALFKI");
Но я не вижу, где определены эти объекты / сущности / ??? (я говорю о Customer и Product )
Я проверил его с помощью сущностей, которые были созданы с использованием Add Service Reference , но это, похоже, не работает.имеют статус без изменений .
Я бы предпочел не ссылаться на сущности EF в моем внешнем интерфейсе, потому что я хотел бы хранить их отдельно и иметь только сериализованные объекты на моем внешнем интерфейсе.Хотя, если это действительно необходимо, я мог бы просто сделать это.
О, использование метода MarkAsModified()
для объекта-сущности работает хорошо, но это скорее хак, поскольку объект должен проверятьего статус сам по себе.
Любой совет, как поступить?Я предполагаю, что использование метода MarkAsModiefied()
или обращение к проекту моделей сущностей в моем веб-приложении может быть эффективным обходным путем, но если есть что-то лучшее, я хотел бы попробовать это в первую очередь.