我有一个像这样的模型
public class User
{
[Key]
public long UserId { get; set; }
[Required]
public String Nickname { get; set; }
public virtual ICollection<Group> Memberships { get; set; }
}
public class Group
{
[Key]
public long GroupId { get; set; }
[Required]
public String Name { get; set; }
public virtual ICollection<User> Members { get; set; }
}
public class DataContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Group> Groups { get; set; }
public DataContext()
{
Configuration.LazyLoadingEnabled = true;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Memberships)
.WithMany(t => t.Members)
.Map(x =>
{
x.MapLeftKey("UserId");
x.MapRightKey("GroupId");
x.ToTable("GroupMembers");
});
}
}
使用测试控制台应用程序访问实体时一切顺利,但我需要通过 WCF 服务来实现这一点,这里我得到了这个异常:
调用服务失败。可能原因:服务离线或无法访问;客户端配置不匹配
代理人;现有代理无效。请参阅堆栈跟踪
更多详情。您可以尝试通过启动新代理、恢复
恢复默认配置,或者刷新服务
我发现实现此功能的唯一方法是删除其中一个实体中的导航器,因为两侧都有导航器会导致无限循环。
有没有办法在不删除导航器的情况下使其工作?
如果您尝试使用 WCF,则会出现两个问题:
- 第一个问题:您是否也想返回相关实体?使用 WCF/序列化时始终关闭延迟加载,并确保手动使用 Include 来获取真正想要返回的关系。否则延迟加载将加载对象图中的所有关系。此外,根据服务处理上下文生命周期的方式,当上下文已经被释放时,可能会发生延迟加载。
- 您必须告诉序列化程序有关循环引用的信息或删除循环引用。 WCF默认使用
DataContractSerializer
。要删除循环引用,您可以标记这些导航属性之一IgnoreDataMember
属性,或者您可以通过标记所有实体来简单地告诉序列化程序有关循环引用的信息DataContract(IsReference = true)
属性和所有应该序列化的成员属性DataMember
属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)