1

私は何を間違っていますか?ウィザードを使用して SQL サーバー データベースをマップしました。これはかなり複雑なデータベースですが、この例では、REPORTROWS、REPORTCOLUMNS、および REPORTNAMES の 3 つのテーブルを想定できます。REPORTROWS には、列 ID、RESULT、REPORTDATE、REPORTCOLUMNID、REPORTNAMEID があります。REPORTNAMES と REPORTCOLUMNS は、ID NAME を持つ非常に単純なテーブルです。ID は常に主キーであり、REPORTCOLUMNSID と REPORTNAMESID は REPORTROWS を REPORTCOLUMNS と REPORTNAMES にリンクする外部キーです。

次に、3 つのテーブルに有効な値を入力します (外部キー制約に違反していません)。次のコードを呼び出すと

var recs = from a in ctx.REPORTROWS
           where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a;

必要な行を取得しますが、フィールド a.REPORTCOLUMNS は null であるため、コードの後半では使用できません!! なんで?REPORTCOLUMNID は、null 非許容の整数として定義されます (これが外部キーである理由です)。ただし、フィールド a.REPORTNAMES は正しいです。a.REPORTDATE は&& a.REPORTCOLUMNS != null、クエリに追加しても null のままです。

同様の質問へのリンクを見たことがありますが、決定的な答えは見つかりませんでした。誰でも私を助けてください。参考までに、私は .NET Framework 3.5 を使用していますが、データベースのマッピング中にウィザードで「外部キーを含める」をチェックできませんでした。グレー表示されていました(理由はまだわかりません)。

事前にどうもありがとう

それはEFバージョンv2.0.50727です

4

1 に答える 1

0

REPORTCOLUMNS (および、REPORTNAMES) テーブルも、コンテキスト内でエンティティとして表す必要があります。遅延読み込みが有効になっておらず、クエリで reportcolumns エンティティ プロパティを明示的にフェッチしなかったためにエラーが発生したと思います。

次のコードまたは同様のものを試すことができます。

var recs = from a in ctx.REPORTROWS.Include(r => r.REPORTCOLUMNS)
           where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a;

主なことは、「Include」メソッドを実行して、クエリを実行するときに Reportcolumn エンティティとそのプロパティを取得することです。

もう 1 つのオプションは、REPORTCOLUMNS 主キーにマップされる REPORTROWS エンティティで REPORTCOLUMNID プロパティを明示的に指定することです。"reportrow.REPORTCOLUMNID" を実行して、関連付けられている reportcolumn エンティティの ID を取得できるはずですが、再度クエリを実行するまで他のプロパティを取得することはできません。

于 2013-01-09T08:23:37.857 に答える