ASP.Net Web Api序列化异常

hyp*_*erN 1 asp.net-mvc entity-framework asp.net-web-api

在Web Api项目中,当我输入url localhost:[portnumber]/api/os时,我得到包含错误的长XML文件,这里是异常消息:

预计不会键入"System.Data.Entity.DynamicProxies.CollegeCourse_C7F37B1980970AF17607E96F17DFE50E3A680141BF8228EEA7D39A9150498388"数据合同名称"//schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies CollegeCourse_C7F37B1980970AF17607E96F17DFE50E3A680141BF8228EEA7D39A9150498388:HTTP".考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

但是当我输入url localhost:[portnumber]/api/role一切都很好,这里是代码:

OS:

public class UserOS
{
    [Key]
    [HiddenInput(DisplayValue = false)]
    public int UserOSId { get; set; }

    public Guid UserId { get; set; }

    public string OSType { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

角色:

public class UserRole
{
    [Key]
    [HiddenInput(DisplayValue = false)]
    public int RoleId { get; set; }

    public string Name { get; set; }

    public ICollection<User> Users { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

角色和操作系统的API控制器类似,所以我只会粘贴角色:

  private CompeteDataBase _competeDataBase = new CompeteDataBase();

   public IEnumerable<UserRole> GetAllRoles()
   {
       return _competeDataBase.UserRoles.AsEnumerable();
   }
Run Code Online (Sandbox Code Playgroud)

编辑

这是使用DTO的正确方法吗?

Jac*_*ack 6

这是因为EntityFramework创建了您的类的"代理".

要使其工作,只需禁用代理创建.您可以进入Context构造函数并添加以下内容:

ContextOptions.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)