实体框架导航属性通过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