明示的な外部キー関係のないLinq To SQL
-
03-07-2019 - |
質問
リレーションシップを持ついくつかのレガシーテーブルを使用していますが、それらのリレーションシップは主キー/外部キーとして明示的に設定されていません。 " 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を試してデータコンテキストクラスを作成する可能性があると同僚から聞いたが、まだ試していないので、時間を無駄にしているのか、別のルートに行くべきかを確認したい。ヒント、リンク、ヘルプをいただければ幸いです。
解決
デザイナーに戻り、関係が正しく設定されていることを確認します。以下に実際の例を示します。BillStateMastersには「CustomerMasters1」があります。プロパティ(州の顧客):
ネーミングはクリーンアップされています...
更新1:また、両方のテーブルにプライマリが定義されていることを確認する必要があります。主キーがデータベースで定義されていない場合(および何らかの理由で定義できない場合)は、デザイナーで定義してください。列のプロパティを開き、主キーとして設定します。ただし、エンティティのプライマリキーがない場合、エンティティの追跡も機能しません。削除の場合、エンティティをサイレントに更新しません。したがって、すべてのエンティティを確認し、それらすべてにプライマリキーを設定してください(先ほど言ったように、データベースに配置できない場合はデザイナーに配置します)。
他のヒント
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};
my" join" linqは少しさびていますが、上記はあなたが望んでいるものに近くなるはずです。
関連付けは1対1または1対多に設定されていますか?関連付けを1対多に設定している場合、所有しているのはEntityRefではなくEntitySetであり、依存セットでwhere句を使用して正しい値を取得する必要があります。デフォルトではない、1対1の関係が必要だと思われます。 1対1に変更してみて、クエリを構築できるかどうかを確認してください。
注:「トラブル」が何であるかを実際に教えていないので、推測しています。実際です。
クエリは正しく見え、Caseオブジェクトのクエリ結果セットを返す必要があります。
それで...問題は何ですか?
(編集)私の問題はそのCaseInfo Casesでは使用できません... c.CaseInfoは私がいる場所に存在しません あると仮定すると 明示的なプライマリ/外部キー 関係。
「利用不可」とはどういう意味ですか?あなたが言ったようにデザイナーで関連付けを作成した場合、クエリは
の行に沿って何かSQLを生成するはずです。SELECT [columns]
FROM Case INNER JOIN CaseInfo
ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'
linqクエリをデバッグして、SQLを生成しましたか?それは何を返しますか?
試してみたいと思うかもしれないもの:
関連付けのプロパティを確認します。 ParentプロパティがPublicとして作成されたことを確認してください。デフォルトでこれを行いますが、何かが変更されている可能性があります。
CでCaseInfoを取得していないので、他の方向に入力してみて、intellisenseでci.Caseを取得するかどうかを確認してください。
関連付けをすべて削除して再作成します。
子メンバーが表示されない場合、非常に基本的な問題が発生しています。 dbmlを削除して全体を再作成するのが最善かもしれません。
他のすべてが失敗した場合は、NHibernateに切り替えます。 :)
いくつかのテストを行った後、Linq-to-SQLで作成されたアソシエーションに関係なく、DBでFK関係が必要になると確信しています。つまり、DBに明示的に設定していない場合は、手動で結合する必要があります。
これはc#ですか?この行では=の代わりに ==
が必要だと思います:
where c.CaseInfo.CaseInfoMeta = "some value"
読むべき
where c.CaseInfo.CaseInfoMeta == "some value"