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

时间:2011-03-01 22:18:26

标签: c# wcf entity-framework-4 poco wcf-rest-starter-kit

我正在使用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);
        }
    }
}

这就是我尝试检索区域 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 个答案:

答案 0 :(得分:2)

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

在这种情况下我做的是在返回数据的操作中,我将其关闭,例如, (注意我在没有智能感知的帮助下从记忆中打字......)

public List GetSomeTrips {    context.ContextOptions.LazyLoadingEnabled = FALSE;    contxt.ContetOptions.ProxyGenerationEnabled = FALSE;
    return context.Trips.ToList(); }

答案 1 :(得分:1)

因为我不能对这个问题发表评论。您是否尝试过设置公共虚拟FixupCollection Trips

作为标准获得的正当性;集;

我在使用datacontracts和定义自定义getter和setter时遇到了困难。 该逻辑应该在实体/对象本身中,因为它将被覆盖。

这对我来说已经解决了很多问题。

答案 2 :(得分:0)

这可能已经存在于您的POCO中,但未包括在内 - 他们是否有构造函数?你可以试试

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

这可以解决空引用错误。如果那是你的班级,FixupCollection也一样。