9

データベースの最初のモデルを使用する:古典的なテーブルStudent,CourseおよびStudentCourse(後者は明らかにFKsをStudentおよびCourseに持っています)があるとします。Entity Frameworkは、交差オブジェクトなしで多対多の関係を処理できますか?

このモデルをEFにインポートすると、それぞれに対してオブジェクトが生成されます。 StudentCourseクラスはそれぞれStudentCoursesのコレクションを持ち、そこから別の関係にジャンプしてCourseまたはStudentにそれぞれ移動する必要があります。

I、すなわちStudentCoursesのコレクションを有し、CourseStudentsのコレクションを有し、基礎となる交差点テーブルが見えないような方法で生成されたコードを持っていると思います。私はこれを他のORMソフトウェア(具体的にはTopLink)で行っています。それはEFでできますか?

+0

'table1table2'モデルを免除するだけですか? –

+0

これは確かにコードファーストで可能です。だから、データベースファーストで可能だと思います。 –

+1

あなたの「StudentCourses」テーブルに追加の列がありますか?この記事では、そうでない場合、あなたが望む動作を得ることを示唆しているようです:http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ –

答えて

9

this tutorialによれば、StudentCourseテーブルには外部キー列しか含まれていない場合、適切な動作が得られます。他の列が含まれている場合、EFは結合を表す中間エン​​ティティを生成します。

この場合、StudentCourseテーブルから代理キーを削除し、複合主キーに置き換える必要があります。

+0

人生救助者の答え... – Javier

+2

基本的に、関係に余分な「属性」があるときはいつでも、EFに余分なエンティティを取得します。サロゲートキーを「属性」と考えるだけです。コインのもう一方の側面は、属性を必要とする場合、この余分なエンティティは必須のものです。 (Employee to JobTitleの関係を考えてみましょう。しかし〜の関係には "StartedOnDate"属性があります。したがって、この余分なエンティティを持つ必要があります。 – granadaCoder

-3

これは、ICollectionsを使用してEFコードファーストで行うことができます。例:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 

    public Student() 
    { 
     Courses = New HashSet<Course>(); 
    } 
} 

コースを繰り返し、すべてをスワップします。これにより、データベースに3つのテーブル(Student、Course、およびStudentCourse)がm対mの関係で作成されます。最も重要なことに、StudentCourseはモデルにエンティティがない目に見えないリンクテーブルになります。

+0

ウェブにはスカウトブルットの負荷があります。私が見つけた最も有用な記事は、[Prashant Brall](http://prashantbrall.wordpress.com/2011/03/23/ef-code-first-managing-relationships/)のものでした。 – markp3rry

+0

〜関係に余分な属性がない限り、正しいです。リチャード・ディーミングの答えに対する私のコメントを見てください。 – granadaCoder

関連する問題