Извлечение 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
если это ваш класс.