2012-01-31 17 views
0

エンティティフレームワーク4.1に問題があります。これは、円で回っているようです。私はQuestionテーブルとの1..Mの関係を持つCaseテーブルを持つシンプルなドメインを作成しようとしています。私は次に質問テーブルからIDを共有する継承されたテーブル( '継承された質問')を持っています。Entity Framework 4.1内で継承されたテーブルの問題

var inheritedCase = context.Set<Case<InheritedQuestion>>.First(); 
InheritedQuestion inheritedQuestion = inheritedCase.Case.Questions.First(); 

が、これがすべてで可能です:

は、彼らがそのように私のような何かができるためにリンクされている場合と質問とInheritedQuestionクラスを関連付ける私は何をしたいのですか?私は、EFにはジェネリックスに関する制限があると信じています手動でクラスプロパティをマッピングすることでこれを回避できるかどうかは疑問です。

現時点では、私はこれをEF経由で実装することはできません。私は以下に私の問題の根拠を含めました。私は流暢なAPIを介してこれを実装しようとしています。

ケーステーブル
ID(PK)

質問表
CaseId(FK)
QuestionId(PK)
フィールド1質問
ク継承

estionId(FK)
フィールド2

これは私のクラスです。

public class Case<T> where T : Question 
{ 
    ICollection<T> Questions {get;set;} 
} 

public class Question 
{ 
    string Field1 {get;set;} 
    Case<Question> Case {get;set;} 
} 

public class InheritedQuestion : Question 
{ 
    string Field2 {get;set;} 
    new Case<InheritedQuestion> Case {get;set;} 
} 
+0

EFは、ここに 'new'修飾子のように/理解していません。 2番目のケースの名前を変更します。 –

+0

@HenkHoltermanそうではありませんが、近いです。 'InheritedQuestion'が' Question'の場合は、 'Case '型のプロパティを持ちます。 'Question'がそのプロパティを持ち、' ​​InheritedQuestion'がそのプロパティを継承している限り、その方法はありません。しかし、 'InheritedQuestion'が書かれているように、それは2つの完全に別々のプロパティ' Case'を持っています。これは意図した振る舞いではありません。これは、EFに適したものにする前に、C#レベルで修正する必要があります。 – hvd

+0

それは、私が思い出すように、EFはカスタムジェネリック型をまったくサポートしていないので、これはうまくいくとは思わないと思います。 – hvd

答えて

1

これはできません。今、あなたのケースは、質問と継承質問の両方に関連付けることができるはず

public class Case 
{ 
    ICollection<Question> Questions {get;set;} 
} 

public class Question 
{ 
    string Field1 {get;set;} 
    Case Case {get;set;} 
} 

public class InheritedQuestion : Question 
{ 
    string Field2 {get;set;} 
} 

:あなたはこれを使用しなければなりません。

2種類のケースタイプを作成する場合や、カスタムロジックをアプリケーションに追加してケースに1つの質問タイプのみが含まれていることを検証する場合は、単一のタイプの質問が必要な場合。

は、あなたがこれを試すことができ、複数のケースの種類をサポートするには、次の

// Not mapped class! 
public abstract BaseCase<T> where T : question 
{ 
    ICollection<T> Questions { get; set; } 
} 

// Mapped entities 
public Case : BaseCase<Question> { } 
public Case2 : BaseCase<InheritedQuestion> { } 
関連する問題