我遇到了一些问题,避免在extern ConfigMgr* configMgr;
中序列化某些ICollection属性。似乎避免序列化的常见建议是添加Web Api
或IgnoreDataMember
。我不想序列化一对多和一对一的属性。
我有以下型号:
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();
});
}
答案 0 :(得分:2)
除了标记成员之外,您不希望使用IgnoreDataMember
进行序列化,在您的情况下(以及一般情况下),最好使用DataContact
标记类并标记您想要的成员< / em>与DataMember
序列化。
您仍然可能想知道为什么使用IgnoreDataMember
和导航属性观察此类行为。我的猜测是 - 当你访问导航属性时支持延迟加载,EF可能会为你的POCO类创建动态代理类。请注意,您的导航属性标有“虚拟”。这是因为EF能够在该动态代理类中覆盖它们并添加延迟加载行为。 IgnoreDataMember
属性不是继承的,因此继承的代理类导航属性不再用它标记,因此序列化程序将尝试包含它们。