【问题标题】:Retrieve EF4 POCOs using WCF REST services starter kit使用 WCF REST 服务入门工具包检索 EF4 POCO
【发布时间】:2011-07-06 21:00:08
【问题描述】:

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

不胜感激。

【问题讨论】:

  • 显示你的 POCO 类的代码。还要检查响应中是否包含集合(使用 Fiddler)并描述如何检索对象和加载的集合(您是否使用动态代理、延迟加载等?)。
  • @Ladislav Mrnka:我已经编辑了我的问题以添加我正在使用的代码。
  • @Greg Sansom:感谢分享该链接。
  • 我想知道这怎么能序列化它的ef。它包含循环引用。
  • @Ladislav Mrnka:那我该怎么做呢?当我从浏览器查询服务时,该集合包含在响应中。

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


【解决方案1】:

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

在这种情况下,我所做的是在返回数据的操作中关闭这些数据,例如, (注意我是在没有智能感知的情况下凭记忆打字的……)

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

【讨论】:

    【解决方案2】:

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

    作为标准获取的属性;设置;

    我在数据契约和定义自定义 getter 和 setter 方面遇到了困难。 该逻辑应该在实体/对象本身中,因为它将被覆盖。

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

    【讨论】:

    • 我尝试将属性设置为标准设置,但没有运气。
    【解决方案3】:

    这可能已经包含在您的 POCO 中,只是没有包含 - 他们有构造函数吗?你可以试试

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

    这可能会解决 null ref 错误。 FixupCollection 相同,如果那是你的课。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多