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

Я использую службу 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 ответа

Решение

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

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

public List GetSomeTrips {context.ContextOptions.LazyLoadingEnabled = false; contxt.ContetOptions.ProxyGenerationEnabled = ложь;
return context.Trips.ToList (); }

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

как уместность со стандартным get; задавать;

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

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

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

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

Это может решить нулевую ошибку ref. То же самое в FixupCollection если это ваш класс.

Другие вопросы по тегам