Самостоятельно отслеживаемые объекты возвращаются без изменений в моей службе WCF

Я установил небольшое 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 Service Reference в Visual Studio или каком-либо другом инструменте, по большей части все выглядит правильно, но вы обнаружите, что сущности на самом деле не отслеживают свои изменения на клиенте.

Что ж, мне удалось создать клиента для службы с помощью этого кода:

var svc = new ChannelFactory<INorthwindSTEService>(
    "INorthwindSTEService")
    .CreateChannel();

Похоже, это работает довольно хорошо. Дело в том, как получить сериализованные сущности на клиенте? В примере кода я вижу, что автор использует этот код:

var products = new List<Product>(svc.GetProducts());
var customer = svc.GetCustomer("ALFKI");

Но я не вижу, где эти объекты / объекты /??? определены (я говорю о клиенте и продукте)

Я протестировал его с помощью сущностей, которые были созданы с использованием Add Service Reference, но, похоже, это не работает. Возвращенные объекты по-прежнему имеют статус Неизменен.

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

О, используя MarkAsModified() Метод на объекте сущности работает хорошо, но это скорее хак, так как сущность должна проверить свой статус самостоятельно.

Любой совет, как поступить? Мое предположение использует MarkAsModiefied() Метод или ссылка на проект моделей сущностей в моем веб-приложении может быть эффективным обходным путем, но если есть что-то лучшее, я хотел бы попробовать это в первую очередь.

1 ответ

Решение

Вам необходимо переместить объекты самообследования из проекта entity frameowrk

если вы посмотрите в файл.tt, то увидите, что есть путь к файлу.edmx, который вы должны заполнить.

Это позволит вам иметь их в проекте отдельно от структуры сущностей.

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

Что касается выполнения обновления... ну, я смотрю на себя;p (я действительно не хочу выводить их в их различные состояния самостоятельно)

Вы говорите: "Убедитесь, что повторно используете сгенерированный код сущности шаблона Self-Tracking Entity на вашем клиенте"

и тогда вы говорите, что не хотите делать это ниже.

Это твоя проблема.

Другие вопросы по тегам