对象无法转换为JSon

时间:2013-05-28 12:36:20

标签: c# asp.net asp.net-web-api entity-framework-5 json.net

我对Entity Framework 5 Code First数据库和Json序列化存在这个奇怪的问题。

我有一个包含以下用户类的数据库

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

    [Required]
    public string Username { get; set; }

    [Required]
    public string DisplayName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [ScaffoldColumn(false)]
    public virtual Outfit ProfileOutfit { get; set; }

    [ScaffoldColumn(false)]
    public virtual PoseAnimation ProfilePose { get; set; }

    [ScaffoldColumn(false)]
    public virtual Mannequin ProfileMannequin { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<int> SubscribedTo { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Fashionshow> Fashionshows { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Outfit> Outfits { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Snapshot> Snapshots { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Achievement> Achievements { get; set; }
}

我在DbContext中有这个:

public class SilkDbContext9 : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<News> News { get; set; }
    public DbSet<Outfit> Outfits { get; set; }
    public DbSet<Fashionshow> Fashionshows { get; set; }
    public DbSet<Entry> Entries { get; set; }
    public DbSet<Location> Locations { get; set; }
    public DbSet<Sound> Sounds { get; set; }
    public DbSet<Snapshot> Snapshots { get; set; }
    public DbSet<OutfitPart> OutfitParts { get; set; }
    public DbSet<Mannequin> Mannequins { get; set; }
    public DbSet<PoseAnimation> PoseAnimations { get; set; }
    public DbSet<WalkAnimation> WalkAnimations { get; set; }
    public DbSet<Achievement> Achievements { get; set; }

    public DbSet<ConstructOutfit> ConstructOutfits { get; set; }

    public DbSet<DesignOutfit> DesignOutfits { get; set; }
}

现在,当我通过ApiController在localhost环境(如使用visual studio进行调试)上请求用户类时,它可以工作并返回一个用户列表或一个用户列表。当我在服务器上请求它时,我将其部署到,但是我得到了以下对象:

{"$id":"1","Message":"An error has occurred."}

我不知道如何做到这一点。我已经尝试从其他对象中删除对User类的所有引用,以防某处有无限循环,但它没有帮助。我也尝试关闭这段代码(这也没有帮助):

var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

我猜我从转换为JSon时得到错误,因为错误没有在get方法中捕获。

简而言之,我有一个对象在本地主机上串行化为Json但在我的IIS服务器上没有。怎么解决这个问题?

更新

我无法记录它(据我所知,我并不熟悉IIS)因为我的API中的get方法似乎有用。这是:

public IEnumerable<object> GetUsers()
    {
        IEnumerable<User> users;

        try
        {
            users = db.Users.AsEnumerable();
        }
        catch
        {
            return new List<string>() { "Error getting the collection" };
        }

        try
        {
            return users;
        }
        catch
        {
            return new List<string>() { "Error returning the collection" };
        }
    }

由于没有返回任何错误字符串,我猜测实际用户被返回,并且序列化到JSon是错误的。我通过访问/ api / users来获得用户。

1 个答案:

答案 0 :(得分:1)

你没有发布足够的代码让我知道是否是这种情况,所以这是一个猜测:我在通过MVC ActionResults序列化EF entites时看到了以下问题:

在处理DbSet之前,您的LINQ查询需要完全具体化(即执行并转换为实体的SQL)。将非实现的IQueryable作为ActionResult的一部分返回是相当容易的,并且通常在Action方法返回之前处理DbSet。当序列化程序尝试枚举导致LINQ查询执行的结果中的某些集合时,这会导致查询在返回语句之后爆炸。

如果这是你的问题,解决办法是确保你的IQueryable在通过调用它上面的ToList()或ToArray()来处理DbSet之前实现。