5

私は次のようなモデルを持っています

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サービスを介してこれを行う必要があります。ここで、次の例外が発生しました。

サービスの呼び出しに失敗しました。考えられる原因:サービスがオフラインであるか、アクセスできません。クライアント側の構成がプロキシと一致しません。既存のプロキシが無効です。詳細については、スタックトレースを参照してください。新しいプロキシを開始するか、デフォルト構成に復元するか、サービスを更新することで、回復を試みることができます

私がこれを機能させる唯一の方法は、エンティティの1つでナビゲーターを削除することです。これは、両側にナビゲーターがあると無限のループが発生するためです。

ナビゲーターを削除せずにこれを機能させる方法はありますか?

4

1 に答える 1

7

WCFを使用しようとすると、2つの問題が発生します。

  • 最初の問題:関連するエンティティも返しますか?WCF /シリアル化を使用する場合は、常に遅延読み込みをオフにし、本当に返したいリレーションに手動でインクルードを使用するようにしてください。それ以外の場合、遅延読み込みはオブジェクトグラフのすべての関係を読み込みます。さらに、サービスがコンテキストのライフサイクルを処理する方法によっては、コンテキストが既に破棄されているときに遅延読み込みが発生する可能性があります。
  • 循環参照についてシリアライザーに通知するか、循環参照を削除する必要があります。WCFはデフォルトでを使用しますDataContractSerializer。循環参照を削除するには、これらのナビゲーションプロパティの1つを属性でマークするか、すべてのエンティティを属性でマークし、すべてのメンバープロパティを属性でIgnoreDataMemberシリアル化することで、循環参照についてシリアライザーに通知します。DataContract(IsReference = true)DataMember
于 2012-07-30T08:34:09.687 に答える