Извлечение POCO EF4 с использованием стартового набора служб WCF REST - PullRequest
4 голосов
/ 02 марта 2011

Я использую службу WCF REST (метод GET) для получения моих POCO EF4. Сервис, похоже, работает просто отлично. Когда я запрашиваю URI в моем браузере, я получаю результаты, как и ожидалось.

В моем клиентском приложении я пытаюсь использовать метод HTTPExtension начального набора WCF REST - ReadAsDataContract () , чтобы преобразовать результат обратно в мой POCO. Это прекрасно работает, когда свойство навигации POCO является одним объектом связанного POCO. Проблема в том, что свойство навигации представляет собой набор связанных POCO. Метод ReadAsDataContract () генерирует исключение с сообщением "Ссылка на объект не установлена ​​на экземпляр объекта."

Ниже мои POCO.

[DataContract(Namespace = "", Name = "Trip")]
public class Trip
{
    [DataMember(Order = 1)]
    public virtual int TripID { get; set; }

    [DataMember(Order = 2)]
    public virtual int RegionID { get; set; }

    [DataMember(Order = 3)]
    public virtual System.DateTime BookingDate { get; set; }

    [DataMember(Order = 4)]
    public virtual Region Region { // removed for brevity 
    }
}

[DataContract(Namespace = "", Name = "Region")]
public class Region 
{
    [DataMember(Order = 1)]
    public virtual int RegionID { get; set; }

    [DataMember(Order = 2)]
    public virtual string RegionCode { get; set; }

    [DataMember(Order = 3)]
    public virtual FixupCollection<Trip> Trips { // removed for brevity
    }
}

[CollectionDataContract(Namespace = "", Name = "{0}s", ItemName = "{0}")]
[Serializable]
public class FixupCollection<T> : ObservableCollection<T>
{
    protected override void ClearItems()
    {
        new List<T>(this).ForEach(t => Remove(t));
    }

    protected override void InsertItem(int index, T item)
    {
        if (!this.Contains(item))
        {
            base.InsertItem(index, item);
        }
    }
}

И вот как я пытаюсь получить Регион POCO.

static void GetRegion()
    {   
        string uri = "http://localhost:8080/TripService/Regions?id=1";
        HttpClient client = new HttpClient(uri);

        using (HttpResponseMessage response = client.Get(uri))
        {
            Region region;
            response.EnsureStatusIsSuccessful();
            try
            {  
                region = response.Content.ReadAsDataContract<Region>(); // this line throws exception because Region returns a collection of related trips
                Console.WriteLine(region.RegionName);                    
            }
            catch (Exception ex)
            {
               Console.WriteLine(ex.Message);
            }
        }
    }

Буду признателен за любые указатели.

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

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

В этом случае я делаю операцию, которая возвращает данные, которые я отключаю, например ((обратите внимание, что я печатаю из памяти безпомощь intellisense ...)

публичный список GetSomeTrips {context.ContextOptions.LazyLoadingEnabled = false;contxt.ContetOptions.ProxyGenerationEnabled = false;
return context.Trips.ToList ();}

1 голос
/ 06 марта 2011

Как не могу прокомментировать вопрос.Вы пробовали установить общедоступные виртуальные поездки FixupCollection

в качестве стандартного стандарта get;set;

У меня возникли проблемы с контрактами данных и определением пользовательских методов получения и установки.Эта логика должна быть в самой сущности / объекте, поскольку она будет переопределена.

Это было исправлением для многих вещей для меня.

0 голосов
/ 06 марта 2011

Это может быть уже в ваших POCO, просто не включены - у них есть конструкторы? Вы можете попробовать

public Region(){
    this.Trips = new FixupCollection<Trip>();
}

Это может решить проблему нулевой ссылки. То же самое в FixupCollection, если это ваш класс.

...