2012-07-30 45 views
5

我有一个像实体框架导航属性循环问题虽然WCF

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服务有这个,在这里我得到了此例外:

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

我发现有这方面的工作的唯一办法是,在实体之一除去导航,因为具有双方的导航员都会导致无限循环。

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

+0

你可以发布正在轰炸的服务方法的代码吗?另外,你可以发布你所得到的异常的细节吗? – Joon 2012-07-30 08:25:54

回答

7

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

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

这在EF6中仍然有效吗?我看到你的回复现在有点过时了。另外,由于我使用的是DB自动生成的类而不是Code First方法,因此覆盖数据模型始终存在此问题。我们如何处理? (部分类很好但不解决归属问题。) – 2015-12-27 13:24:29

+1

@KonradViltersten:如果您的类是由T4模板自动生成的,则可以直接修改模板以生成您需要的属性。这将确保每次模型重新生成时都会有属性。 – 2015-12-30 13:08:36