使用实体框架4使用Web Api返回复杂对象

时间:2011-12-15 04:39:24

标签: c# entity-framework lambda wcf-web-api

我使用WebApi和Entity Framework构建了一个REST服务。在我的应用程序中,我有两个项目 - 一个具有API功能,另一个具有我将在我的Web项目中使用的模型类。

我遇到的问题是我似乎无法为任何实体渲染子集合。比方说我有以下两个类:

    public class User
    {
        public int UserId { get; set; }

        public string Name { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public virtual Collection<Achievement> Achievements { get; set; }
    }

    public class Achievement
    {
        public int AchievementId { get; set; }

        public string Achievement { get; set; }
        public string Value { get; set; }

        public User User { get; set; }
    }

我希望使用以下对我的存储库的调用来检索User实体和所有User成就的集合(假设我已经为每个2个对象设置了DbSet)

var user = dbContext.Users
                .Include(u=>u.Achievements)
                .Where(u=>u.UserId == 1)
                .First();

我运行此代码并通过包含上述语句的方法进行调试,并且它正确检索了我需要的所有信息,但是,在此之后数据未呈现给浏览器,而是内容长度为零返回。

我已经阅读了很多有关此事的广泛信息,似乎有建议创建自定义序列化程序来处理复杂的外来实体。我只是认为必须有一个更好的方法......这肯定会成为webapi框架开发中的一个问题 - 我觉得我错过了一些基本的东西

感谢。

2 个答案:

答案 0 :(得分:4)

您缺少的基本部分,并且您远非孤军奋战,因为Web API框架的工作是使您能够使用HTTP将有效负载从A点传输到B点。

如何构建这些有效负载是一个完全独立的问题,应该被视为应用程序的一个独特部分。对于简单的情况,Web API团队已经尝试构建一些简单的有效负载构建工具,但是如果您正在尝试构建任何体面的应用程序,那么我建议您完全控制该过程。不要指望Web API为您做到这一点。

答案 1 :(得分:0)

let me know if its a serialization issue.

[DataContract]  
public class User
{
    [DataMember]
    public int UserId { get; set; }

  [DataMember]
        public string Name { get; set; }

  [DataMember]
        public string FirstName { get; set; }

  [DataMember]
        public string LastName { get; set; }

  [DataMember]
        public virtual Collection<Achievement> Achievements { get; set; }
    }

   [DataContract]  
    public class Achievement
    {

  [DataMember]
        public int AchievementId { get; set; }

  [DataMember]
        public string Achievement { get; set; }

  [DataMember]
        public string Value { get; set; }

  [DataMember]
        public User User { get; set; }
    }