即使使用IgnoreDataMember和JsonIgnore,也尝试了ICollection的序列化

时间:2016-05-01 20:26:23

标签: c# asp.net-web-api code-first

我遇到了一些问题,避免在extern ConfigMgr* configMgr; 中序列化某些ICollection属性。似乎避免序列化的常见建议是添加Web ApiIgnoreDataMember。我不想序列化一对多和一对一的属性。

我有以下型号:

JsonIgnore

然而,当我对端点进行POST时,我得到以下异常:

  

ObjectContext实例已被释放,不能再用于需要连接的操作。

在这种情况下,它应该只是尝试序列化public class Player { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key, Column(Order=0)] public Guid PlayerId { get; set; } [IgnoreDataMember] public virtual ICollection<Player> Friends { get; set; } [IgnoreDataMember] [Required] public string Password { get; set; } [MaxLength(100)] [Index(IsUnique = true)] public string Username { get; set; } [IgnoreDataMember] public virtual ICollection<WordChallenge> IssuedChallenges { get; set; } [IgnoreDataMember] public virtual ICollection<WordChallenge> ReceivedChallenges { get; set; } } PlayerId

自请求以来,以下内容管理dbContext:

Username

控制器:

public async Task<IEnumerable<Player>> GetFriends(Guid playerId)
{
    //Handles common exceptions and manages the dbcontext. In this case context is disposed off after the interaction is done.
    return await DbInteraction(
        async dbModel =>
        {
            var player = await GetPlayerById(playerId, dbModel);
            return player.Friends.ToList();
        });
}

1 个答案:

答案 0 :(得分:2)

除了标记成员之外,您不希望使用IgnoreDataMember进行序列化,在您的情况下(以及一般情况下),最好使用DataContact标记类并标记您想要的成员< / em>与DataMember序列化。

您仍然可能想知道为什么使用IgnoreDataMember和导航属性观察此类行为。我的猜测是 - 当你访问导航属性时支持延迟加载,EF可能会为你的POCO类创建动态代理类。请注意,您的导航属性标有“虚拟”。这是因为EF能够在该动态代理类中覆盖它们并添加延迟加载行为。 IgnoreDataMember属性不是继承的,因此继承的代理类导航属性不再用它标记,因此序列化程序将尝试包含它们。