2

我在使用 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 来获取用户。

4

1 回答 1

1

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

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

如果这是您的问题,则解决方案是通过在其上调用 ToList() 或 ToArray() 来确保在处理 DbSet 之前实现您的 IQueryable。

于 2013-05-28T12:44:07.237 回答