EF 4 Self Tracking Entities не работает должным образом - PullRequest
1 голос
/ 30 января 2010

Я использую 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 ]

3 голосов
/ 30 января 2010

Это, вероятно, длинный выстрел ... но:

Я предполагаю, что ваша служба на самом деле находится на другом уровне? Если вы проводите тестирование на одном уровне, у вас будут проблемы.

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

STE начинают отслеживать после того, как они десериализованы на клиенте с использованием WCF, т. Е. После того, как они материализованы на уровне без ObjectContext.

Если вы посмотрите на сгенерированный код, вы также сможете увидеть, как включить отслеживание вручную.

Надеюсь, это поможет

Alex

1 голос
/ 09 января 2011

Вы должны делиться сборкой с STE между клиентом и сервисом - это главное. Затем при добавлении сервисной ссылки убедитесь, что установлен флажок «Повторное использование типов в ссылочных сборках».

Причина этого заключается в том, что STE содержат логику, которая не может быть передана с помощью «Добавить ссылку на службу», поэтому вам необходимо совместно использовать эти типы, чтобы иметь также логику трассировки на клиенте.

0 голосов
/ 09 ноября 2011

У меня была точно такая же проблема, и я нашел решение.

Похоже, что для автоматического отслеживания сущностей с самостоятельным отслеживанием необходимо добавить ссылку на свой проект STE, прежде чем добавлять ссылку на службу.

Таким образом Visual Studio генерирует некоторые файлы .datasource, которые выполняют последний трюк.

Я нашел решение здесь: http://blogs.u2u.be/diederik/post/2010/05/18/Self-Tracking-Entities-with-Validation-and-Tracking-State-Change-Notification.aspx

Что касается запуска отслеживания вручную, похоже, что у вас нет этих методов на стороне клиента.

Надеюсь, это поможет ...

0 голосов
/ 23 марта 2010

Если вы используете STE без WCF, возможно, вам придется вызывать StartTracking () вручную.

0 голосов
/ 02 февраля 2010

После прочтения следующего совета от Дэниела Симмонса 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);
...