15

リレーションシップを持ついくつかのレガシー テーブルを使用していますが、それらのリレーションシップはプライマリ/外部キーとして明示的に設定されていません。「Linq To Sql Classes」を使用して .dbml ファイルを作成し、適切な Case.CaseID = CaseInfo.CaseID 関連付けを確立しました。結果のクラスは CasesDataContext です。

マイ テーブル (1 対多):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

私は LinqToSQL を初めて使用し、実行に問題があります..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(編集) 私の問題は、CaseInfo または CaseInfos が Cases のメンバーとして利用できないことです。

同僚から、ADO.Net Entity Data Model を使用してデータ コンテキスト クラスを作成する可能性があると聞きましたが、まだ試していないので、時間を無駄にするか、別のルートに進むべきかを知りたいと思っていました。ヒント、リンク、ヘルプをいただければ幸いです。

4

7 に答える 7

26

デザイナに戻り、リレーションが正しく設定されていることを確認します。これが実際の例の1つで、BillStateMastersには「CustomerMasters1」プロパティ(州の顧客)があります。 代替テキスト

追伸 ネーミングがクリーンアップされています...

更新1:両方のテーブルにプライマリが定義されていることも確認する必要があります。主キーがデータベースで定義されていない場合(および何らかの理由で定義できない場合)は、必ずデザイナで定義してください。列のプロパティを開き、主キーとして設定します。とはいえ、エンティティの主キーがない場合、エンティティトラッキングも機能しません。つまり、削除の場合、エンティティはサイレントに更新されません。したがって、必ずすべてのエンティティを確認し、それらすべてに主キーを設定してください(前述のように、データベースに配置できない場合は、デザイナーに配置してください)。

于 2009-03-06T23:15:06.670 に答える
5
CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

私の「結合」linqは少しさびていますが、上記はあなたが求めているものに近づくはずです。

于 2009-03-09T21:35:13.437 に答える
0

これはC#ですか?==この行で=の代わりに必要だと思います:

where c.CaseInfo.CaseInfoMeta = "some value"

読む必要があります

where c.CaseInfo.CaseInfoMeta == "some value"
于 2009-03-06T18:51:39.830 に答える
0

いくつかのテストの後、Linq-to-SQL で作成された関連付けに関係なく、DB で FK 関係が必要であると確信しています。つまり、DB に明示的に設定していない場合は、手動で結合する必要があります。

于 2009-03-10T19:36:21.357 に答える
0

あなたが試してみたいかもしれないいくつかのこと:

関連付けのプロパティを確認します。Parent プロパティが Public として作成されていることを確認します。これはデフォルトで行われますが、何かが変更されている可能性があります。

C では CaseInfo を取得していないため、逆方向に入力して、intellisense で ci.Case が取得されるかどうかを確認してください。

関連付けをすべて削除して再作成します。

子メンバーが表示されない場合は、非常に基本的な問題が発生しています。dbml を削除して、全体を再作成するのが最善かもしれません。

他のすべてが失敗した場合は、NHibernate に切り替えます。:)

于 2009-03-06T18:01:35.707 に答える
0

関連付けは 1 対 1 または 1 対多に設定されていますか? 関連付けを 1 対多に設定している場合、これは EntityRef ではなく EntitySet であり、正しい値を取得するには依存セットで where 句を使用する必要があります。1 対 1 の関係を望んでいると思われますが、これはデフォルトではありません。1 対 1 に変更して、クエリを作成できるかどうかを確認してください。

注:「問題」が実際に何であるかを実際に私たちに伝えていないので、私は推測しています.

于 2009-03-06T15:33:20.523 に答える
0

クエリは正しく、Case オブジェクトのクエリ結果セットを返すはずです。

だから問題は何ですか?

(編集) 私の問題は、Cases で CaseInfo を使用できないことです... iecCaseInfo は、明示的なプライマリ/外部キーの関係があった場合に想定される場所には存在しません。

「利用できません」とはどういう意味ですか? あなたが言ったようにデザイナーで関連付けを作成した場合、クエリは次の行に沿ってSQLを生成する必要があります

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

SQL を生成するために linq クエリをデバッグしましたか? それは何を返しますか?

于 2009-03-06T15:36:02.733 に答える