EF 4 Self Tracking Entities не работает должным образом
Я использую EF4 Self Tracking Entities (VS2010 Beta 2 CTP 2 плюс новый генератор T4). Но когда я пытаюсь обновить информацию о сущности, она не обновляется в базу данных, как ожидалось.
Я настраиваю 2 сервисных вызова. один для GetResource(int id), который возвращает объект ресурса. второй вызов - SaveResource(Resource res); вот код
public Resource GetResource(int id)
{
using (var dc = new MyEntities())
{
return dc.Resources.Where(d => d.ResourceId == id).SingleOrDefault();
}
}
public void SaveResource(Resource res)
{
using (var dc = new MyEntities())
{
dc.Resources.ApplyChanges(res);
dc.SaveChanges();
// Nothing save to database.
}
}
//Windows Console Client Calls
var res = service.GetResource(1);
res.Description = "New Change"; // Not updating...
service.SaveResource(res);
// does not change anything.
Мне кажется, что ChangeTracker.State всегда отображается как "Без изменений".
что-то не так в этом коде?
5 ответов
Это, вероятно, длинный выстрел... но:
Я полагаю, что ваша служба на самом деле находится на другом уровне? Если вы тестируете на одном уровне, у вас будут проблемы.
Самообследуемые объекты (STE) не записывают изменения до тех пор, пока они не подключены к ObjectContext, идея заключается в том, что если они подключены к ObjectContext, они могут записывать изменения для них, и нет смысла выполнять одну и ту же работу дважды.
STE начинают отслеживание после того, как они десериализованы на клиенте с использованием WCF, т. Е. Как только они материализованы на уровень без ObjectContext.
Если вы посмотрите на сгенерированный код, вы также сможете увидеть, как включить отслеживание вручную.
Надеюсь это поможет
Alex
Вы должны делиться сборкой с STE между клиентом и сервисом - это главное. Затем при добавлении сервисной ссылки убедитесь, что установлен флажок "Повторное использование типов в ссылочных сборках".
Причина этого заключается в том, что STE содержат логику, которая не может быть передана с помощью "Добавить ссылку на службу", поэтому вы должны совместно использовать эти типы, чтобы иметь также логику трассировки на клиенте.
Если вы используете STE без WCF, возможно, вам придется вызывать StartTracking() вручную.
Прочитав следующий совет Дэниела Симмонса, STE начинает отслеживать. Вот ссылка на полную статью. http://msdn.microsoft.com/en-us/magazine/ee335715.aspx
Не забудьте повторно использовать сгенерированный код сущности шаблона Self-Tracking Entity на своем клиенте. Если вы используете прокси-код, сгенерированный Add Service Reference в Visual Studio или каком-либо другом инструменте, по большей части все выглядит правильно, но вы обнаружите, что сущности на самом деле не отслеживают свои изменения на клиенте.
поэтому в клиенте убедитесь, что вы не используете add service reference, чтобы получить прокси вместо доступа к сервису через следующий код.
var svc = new ChannelFactory<IMyService>("BasicHttpBinding_IMyService").CreateChannel();
var res = svc.GetResource(1);
У меня была точно такая же проблема, и я нашел решение.
Похоже, что для автоматического отслеживания сущностей с самостоятельным отслеживанием необходимо добавить ссылку на свой проект STE, прежде чем добавлять ссылку на службу.
Таким образом, Visual Studio генерирует некоторые файлы.datasource, что делает последний трюк.
Я нашел решение здесь: http://blogs.u2u.be/diederik/post/2010/05/18/Self-Tracking-Entities-with-Validation-and-Tracking-State-Change-Notification.aspx
Что касается запуска отслеживания вручную, кажется, что у вас нет этих методов на стороне клиента.
Надеюсь, поможет...