WCF, Entity Framework 4.1 и состояние объекта
Я разрабатываю приложение, которое будет предоставлять услуги 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 ответа
Насколько известно, нет способа отследить изменения графа обособленного объекта, кроме самопроверяющихся объектов (которые вы не можете использовать, как говорите).
Что я обычно делаю для обновления отдельного графа, так это для перезагрузки исходного графа из базы данных, сравнения исходного с измененным графиком (рукописный код для каждого конкретного случая), чтобы увидеть, какие объекты были добавлены, изменены и удалены, записать изменения в оригинал и сохранить контекст.
Пример этой процедуры (для одной родительской и дочерней коллекции, например, коллекции Customer и Order) приведен в ответах на этот вопрос: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не могут быть обнулены
К сожалению, это становится довольно сложным, если вам приходится иметь дело с более глубокой иерархией сущностей. Насколько я вижу, EF не предлагает никакого автоматического слияния измененного графа с оригиналом, только для очень простого случая, когда у сущности есть только скалярные и сложные свойства, которые были изменены. Как только свойства навигации будут задействованы, у вас больше не будет поддержки от EF, и вам придется самостоятельно писать логику обновления.
Интересно, имеет ли смысл отвечать на ваши вопросы, потому что, похоже, вы не читаете ответы.
Вы задали вопрос о STE и получили ответы об их удобстве использования.
- Я добавил ссылку, где было явно описано, что они не для совместимых сценариев
- Ричард опубликовал очень хорошие ссылки о STEs и о пользовательском отслеживании изменений - кстати. это именно то, что вы ищете сейчас
Вы, вероятно, не читали эти ответы, потому что использовали STE, и после этого вы задали вопрос, как использовать STE в клиенте Java.
Что удивило меня еще больше, вы сделали дубликат своего собственного вопроса о STE и EFv4.1
- Могу ли я использовать Self Tracking Entities и DBContext в Entity Framework 4.1?
- Использование объектов STE в Entity Framework 4.1
Сегодня вы уже получите ответ на этот вопрос в другом вашем вопросе.
Так какой ответ вы ожидаете? Стоит ли отвечать на ваши вопросы, если вы не читаете ответы?
Ответ:
Для DbContext нет шаблона STE, и если вы не используете STE, вы должны полностью самостоятельно отслеживать изменения, потому что EF вам не помогает. Самый простой подход описан в вашем предыдущем вопросе - снова загрузите граф объектов в сервисе и объедините входящий граф с присоединенными объектами, чтобы контекст мог отслеживать изменения. Более сложное решение описано в ссылке @Richard, приведенной в одном из ваших предыдущих вопросов о STE - вы должны добавить какое-либо свойство состояния для каждой передаваемой сущности, и клиент должен установить их правильно и отправить их обратно вам, чтобы вы могли вручную установить правильные указать для каждой сущности, как только вы присоедините их - это может быть немного сложно в случае некоторых отношений.