我对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来获得用户。
答案 0 :(得分:1)
你没有发布足够的代码让我知道是否是这种情况,所以这是一个猜测:我在通过MVC ActionResults序列化EF entites时看到了以下问题:
在处理DbSet之前,您的LINQ查询需要完全具体化(即执行并转换为实体的SQL)。将非实现的IQueryable作为ActionResult的一部分返回是相当容易的,并且通常在Action方法返回之前处理DbSet。当序列化程序尝试枚举导致LINQ查询执行的结果中的某些集合时,这会导致查询在返回语句之后爆炸。
如果这是你的问题,解决办法是确保你的IQueryable在通过调用它上面的ToList()或ToArray()来处理DbSet之前实现。