实体框架导航属性通过WCF循环问题

Mic*_*cky 5 wcf entity-framework infinite-loop code-first

我有一个像这样的模特

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");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

使用测试控制台应用程序访问实体时一切正常,但我需要通过WCF服务,这里我得到了这个例外:

无法调用该服务.可能的原因:服务离线或无法访问; 客户端配置与代理不匹配; 现有代理无效.有关更多详细信息,请参阅堆栈跟踪.您可以尝试通过启动新代理,还原到默认配置或刷新服务来进行恢复

我发现这个工作的唯一方法是删除其中一个实体中的导航器,因为两侧的导航器都会导致无限循环.

有没有办法让这个工作没有删除导航器?

Lad*_*nka 7

如果您尝试使用WCF,则有两个问题:

  • 第一个问题:您是否也希望返回相关实体?在使用WCF /序列化时始终关闭延迟加载,并确保手动使用Include来实现您真正想要返回的关系.否则延迟加载将加载对象图中的所有关系.此外,根据服务处理上下文生命周期的方式,延迟加载可能在已经处理上下文时发生.
  • 您必须告知序列化程序有关循环引用或删除循环引用.WCF默认使用DataContractSerializer.要删除循环引用,您可以使用IgnoreDataMember属性标记其中一个导航属性,或者您可以通过标记具有DataContract(IsReference = true)属性的所有实体和应该使用DataMember属性序列化的所有成员属性来告诉序列化器有关循环引用的信息.