0

他のいくつかのエンティティから参照されるエンティティ/クラス/テーブルがあり、FluentNHibernateを使用してORMを処理しています。いくつかの例では、外部キーIDを列として格納し、その簡単な方法で参照を処理できる単純な参照ですが、他のいくつかの例では、これらの項目のリストを参照する必要があります。私が考えることができる少なくとも3つのクラス。この設定は、他のクラスの関係を処理するためにコピーされると想定できます。

HasMany共通のエンティティ( s内の他のいくつかのエンティティによって所有されているエンティティ)は次のようになります。

public class Student {
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
}

そして、ShopCourseエンティティは次のようになります。

public class ShopCourse {
    public virtual int Id {get; set;}
    public virtual int Name {get; set;}
    public virtual IList<Student> Students {get; set;}
}

特定のコースなど、私が持っている他のいくつかのクラスが、複数の学生を「所有」できると想像してみてください。その関係を維持するために、2つの間の外部キーを追跡するテーブルをデータベースに作成する必要があります(参照するエンティティごとにStudent)-この中間テーブルにエンティティは必要ありません。Fluentは、私がいない限り、それについて考える必要はありません。テーブル自体の文字列名を渡します。

表:ShopCourseStudents

int - ShopCourseId
int - StudentId

最後に、これが私のマッピングです。エンティティ自体が適切にマップされていると想定できます。IDの命名スキームなどは解決され、正しく機能しています。問題は、次のいずれかを持つエンティティを初期化しようとしたときに発生しHasManyますStudent

//Inside a FluentlyConfigure().Mappings(m => m.AutoMappings.Add() call:
.Override<ShopCourse>(map => {
    map.HasMany(x => x.Students)
        .Table("ShopCourseStudents")
        .KeyColumns.Add("ShopCourseId")
        .KeyColumns.Add("StudentId")
        .Cascade.All();
    })

問題は、リストを読み込もうとするとShopCourse、Fluentエラーが発生することです。

外部キー(ABC123AF9:Student [ShopCourseId、StudentId])には、参照される主キー(ShopCourses [Id])と同じ数の列が必要です。

Fluentのマッピングは単純なので、オーバーライドしませStudent。この例では、それがどのコースに属しているか、またはその特定のレコードを所有している可能性のある他のコースStudentを知る必要はありません。ShopCourseStudent

これは私が何か基本的なことをしているように見えます、間違っています-それは正確には何ですか?事前に多くの義務があります!

4

1 に答える 1