WCF, Entity Framework 4.1 и состояние объекта - PullRequest
0 голосов
/ 10 августа 2011

Я разрабатываю приложение, которое будет предоставлять сервисы WCF. Я использую Entity Framework 4.1 в DAL. Проблема в том, что я загружаю какую-то сущность (скажем, клиент, у которого есть Order, у которого, в свою очередь, есть OrderDetail). После загрузки я делаю некоторые изменения в объектах Customer, Order и OrderDetail (добавляются некоторые новые заказы, а некоторые существующие удаляются / обновляются) и отправляю граф объектов в службу WCF, чтобы обновить его следующим образом.

Customer oCustomer;
using(var context = new MyContext) //MyContext is dbContext
{
    oCustomer = context.Include("Order.OrderDetail").Find(1);
}

oCustomer.Name ="blah blah";
Order oOrder1 = oCustomer.Order.Where(obj=>obj.Id == 2);
oOrder1.Description = "blah blah";
oOrder1.OrderDetail.Quantity = 10;

Order oOrder2 = new Order { ... } //properties of Order are set.
oCustomer.Order.Add(oOrder2);

oCustomer.Order.Remove(context.Order.Find(1));

ServiceClient client = new ServiceClient();
client.SaveCustomer(oCustomer);

Теперь, когда я получаю обновленный объектный граф клиента на стороне сервера, я не знаю, какой заказ был удален, а какой был изменен, поскольку отслеживание изменений в настоящее время не выполняется. Как я могу определить, какой ордер удалить и какой ордер изменить? Есть ли способ отследить изменения в моем графе объектов в Entity Framework 4.1?

ПРИМЕЧАНИЕ. Ранее я использовал Self Tracking Entities, которые решили эту проблему, но мне пришлось избавиться от STE, поскольку моя служба WCF также будет использоваться клиентскими приложениями Java. Таким образом, STEs не вариант для меня.

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Интересно, имеет ли смысл отвечать на ваши вопросы, потому что похоже, что вы не читаете ответы.

Вы задали вопрос о STE и получили ответы об их удобстве использования.

  • Я добавил ссылку, где было явно указано, что они не предназначены для взаимодействия сценариев
  • Ричард опубликовал очень хорошие ссылки о STE и о отслеживании пользовательских изменений - кстати.это именно то, что вы сейчас ищете

Возможно, вы не читали эти ответы, потому что использовали STE, а после этого задали вопрос как использовать STE в клиенте Java .

Что удивило меня еще больше, когда вы повторили свой собственный вопрос о STE и EFv4.1

Сегодня вы уже получили ответ на этот вопрос в другом вашем вопросе .

Так какой ответ вы ожидаете?Стоит ли отвечать на ваши вопросы, если вы не читаете ответы?

Ответ:

Нет шаблона STE для DbContext, и если вы не используете STE, вы должны полностью следите за изменениями , потому что EF вам не поможет.Самый простой подход описан в вашем предыдущем вопросе - снова загрузите граф объектов в сервисе и объедините входящий граф с присоединенными объектами, чтобы контекст мог отслеживать изменения.Более сложное решение описано в ссылке @Richard, приведенной в одном из ваших предыдущих вопросов о STE - вы должны добавить какое-либо свойство состояния для каждой передаваемой сущности, и клиент должен установить их правильно и отправить их вам обратно, чтобы вы могли вручную установить правильныеукажите для каждой сущности, как только вы присоедините их - это может быть немного сложно в случае некоторых отношений.

2 голосов
/ 10 августа 2011

Насколько известно, нет способа отследить изменения графа обособленных объектов, кроме самопроверяющихся объектов (которые вы не можете использовать, как вы говорите).

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

Пример этой процедуры (для одного родительского и дочернего набора, например, коллекции клиентов и заказов) приведен в ответах на этот вопрос: Отношение не может быть изменено, поскольку один или несколько изСвойства внешнего ключа не обнуляются

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

...