0

私はいくつかのPOCOクラスを持っており、それらは一般的に2つのグループに分けることができます。

public class Student
{
    public Student()
    {
        this.Courses = new List<Course>();
        this.Clubs = new List<Club>();
    }

    public int Id { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
    public virtual ICollection<Club> Clubs { get; set; }
}

および対応するコースとクラブのクラスであり、それらはすべて他のクラスと独自の関係を持っています。

問題は、これら2つのグループが大きく、両方に多くのクラスが含まれており、それぞれがコースに関連するすべての機能を提供する学生コース管理ユニットのような作業ユニットであるということです。機能を提供するクラブ管理ユニット。したがって、これらを1つのDbContextにまとめる予定はありません。

クラブから学生を取得し、そのコース情報を取得するために必要ないくつかの要件があります。私が今していることは、クラブユニットから取得した学生IDを使用して、コースユニットで別のクエリを実行することです。これは問題なく動作しますが、私はそれをより単純にするためにホッピングします

foreach(var student in club.Students){
    ClubContext.Detach(student);
    CourseContext.Attach(student);
    foreach(var c in student.Courses){
      ...
    }
}

しかし、私はこのようないくつかの例外を受け取りました:

オブジェクトレイヤータイプ「POCOTest.Models.Student」に対して生成されたプロキシタイプがすでにあります。これは、同じオブジェクトレイヤータイプがAppDomain内の2つ以上の異なるモデルによってマップされている場合に発生します。

これは可能ですか?もしそうなら、どのように?ありがとう〜

4

2 に答える 2

2

単一のクラスを複数のコンテキストにマッピングすることもできますが、マッピングは常に同じである必要があります。同じでない場合、各マッピングはナビゲーションプロパティを処理する独自のプロキシタイプを必要とするため、動的プロキシ(遅延読み込み)を使用できません。

あなたの場合、最初のコンテキストマッピングにはStudentとの関係を持つエンティティが含まれていますClubが、この関係は、とは逆の関係がCourse存在する2番目のマッピングには存在しません。これには、同じエンティティタイプに対して2つの異なるプロキシタイプが必要です。

例外は、サポートされていないことを示しています。これが機能しない理由は2つあります。

  • EFは、プロキシタイプを静的ディクショナリに格納します。各エンティティタイプは、生成されたプロキシを1つだけ持つことができます。
  • 最初のポイントを修正しても(ソースコードをダウンロードして変更することで)、プロキシタイプがエンティティであるため、希望することを実行できません。ラッパーではありません。したがって、最初のコンテキストからタイプを切り離して2番目のコンテキストにアタッチするときに、タイプを置き換えることはできません。
于 2012-09-14T19:29:31.447 に答える
0

遅延読み込みが必要ない場合は、ナビゲーションプロパティから「virtual」キーワードを削除するだけで、希望どおりに機能します。仮想は、遅延読み込みを有効にするために使用されます。

于 2014-05-27T20:07:45.203 に答える