gpt4 book ai didi

c# - 使用 WCF REST 服务入门工具包检索 EF4 POCO

转载 作者:行者123 更新时间:2023-11-30 12:16:34 24 4
gpt4 key购买 nike

我正在使用 WCF REST 服务(GET 方法)来检索我的 EF4 POCO。该服务似乎工作得很好。当我在浏览器中查询 uri 时,我得到了预期的结果。

在我的客户端应用程序中,我尝试使用 WCF REST Starter Kit's HTTPExtension 方法 - 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);
}
}
}

这就是我尝试检索 Region 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);
}
}
}

不胜感激。

最佳答案

要检查的另一件事是代理生成和延迟加载是否破坏了查询和返回结果的操作。您的属性都标记为虚拟的事实会导致生成代理并启用延迟加载。当您使用这两个功能进行序列化时,它会对序列化程序造成严重破坏。

我在这种情况下所做的是在返回数据的操作中我关闭了这些数据,例如,(请注意,我是在没有智能感知帮助的情况下凭内存输入的...)

公共(public)列表 GetSomeTrips{ context.ContextOptions.LazyLoadingEnabled=false; contxt.ContetOptions.ProxyGenerationEnabled=false;
返回 context.Trips.ToList();

关于c# - 使用 WCF REST 服务入门工具包检索 EF4 POCO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5161098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com