2012-07-30 76 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