我使用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框架开发中的一个问题 - 我觉得我错过了一些基本的东西
感谢。
答案 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; }
}