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

实体框架导航属性通过WCF循环问题,wcf,entity-framework,code-first,infinite-loop,Wcf,Entity Framework,Code First,Infinite Loop,我有一个这样的模特 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

我有一个这样的模特

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");
        });
    }
}
公共类用户
{
[关键]
公共长用户标识{get;set;}
[必需]
公共字符串昵称{get;set;}
公共虚拟ICollection成员身份{get;set;}
}
公共课组
{
[关键]
公共长GroupId{get;set;}
[必需]
公共字符串名称{get;set;}
公共虚拟ICollection成员{get;set;}
}
公共类DataContext:DbContext
{
公共数据库集用户{get;set;}
公共数据库集组{get;set;}
公共数据上下文()
{
Configuration.LazyLoadingEnabled=true;
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(u=>u.Memberships)
.有许多(t=>t个成员)
.Map(x=>
{
x、 MapLeftKey(“用户ID”);
x、 MapRightKey(“GroupId”);
x、 ToTable(“集团成员”);
});
}
}
当使用测试控制台应用程序访问实体时,一切正常,但我需要通过WCF服务实现这一点,这里我得到了一个例外:

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

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


有没有一种方法可以在不移除导航器的情况下使其工作?

如果您尝试使用WCF,则会出现两个问题:

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

您能发布正在轰炸的维修方法的代码吗?另外,你可以发布你得到的异常的详细信息吗?这在EF6中仍然有效吗?我看你的答复现在有点过时了。另外,由于我使用的是从DB自动生成的类,而不是代码优先的方法,所以覆盖数据模型总是存在这个问题。我们如何应对?(分部类很好,但不能解决属性问题。)@KonradViltersten:如果您的类是由T4模板自动生成的,您可以直接修改模板以生成所需的属性。这将确保每次重新生成模型时属性都处于适当位置。