【问题标题】:ASP.Net Web Api Serialization ExceptionASP.Net Web Api 序列化异常
【发布时间】:2012-12-08 23:16:33
【问题描述】:

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

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

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

操作系统:

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; }
}

角色:

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

    public string Name { get; set; }

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

}

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

  private CompeteDataBase _competeDataBase = new CompeteDataBase();

   public IEnumerable<UserRole> GetAllRoles()
   {
       return _competeDataBase.UserRoles.AsEnumerable();
   }

编辑

使用 DTO 的方法是否正确?

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-web-api


    【解决方案1】:

    这是因为 EntityFramework 为您的班级创建了一个“代理”。

    要完成这项工作,只需禁用代理创建即可。您可以进入 Context 构造函数并添加以下内容:

    ContextOptions.ProxyCreationEnabled = false;
    

    【讨论】:

    • 我已将这两行添加到我的 DbContext 构造函数中 this.Configuration.ProxyCreationEnabled = false; this.Configuration.LazyLoadingEnabled = false;但我得到同样的错误
    • 你能检查你的调试器,查看要返回的对象并确保对象代理没有被创建
    • 不是这样,我以某种方式通过删除数据库并重新创建它来解决问题:/
    【解决方案2】:

    我设法解决了问题,我不知道如何或为什么,但删除数据库并再次装箱解决了所有问题(我没有更改任何其他内容)

    有人知道为什么吗???

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多