トラブルシューティング
ここでは、LINQ to SQL アプリケーションで発生する可能性のある問題をいくつか示し、そうした問題を回避または影響を軽減するための提案を示します。
その他の問題については、「よく寄せられる質問」セクションをご覧ください。
サポートされない標準クエリ演算子
LINQ to SQL は、すべての標準クエリ演算子メソッド (たとえば ElementAt) をサポートするわけではありません。 このため、コンパイルできたプロジェクトでも、ランタイム エラーが発生する可能性があります。 詳細については、「標準クエリ演算子の変換」を参照してください。
メモリの問題
クエリにメモリ内コレクションと LINQ to SQL の Table<TEntity> が含まれる場合、2 つのコレクションの指定順序に応じて、メモリ内でクエリが実行される可能性があります。 クエリをメモリ内で実行する必要がある場合、データベース テーブルのデータを取得する必要があります。
この手法は非効率的で、メモリとプロセッサの消費量が非常に大きくなる可能性があります。 このような複数ドメインのクエリはできる限り使用しないでください。
ファイル名と SQLMetal
入力ファイル名を指定するには、その名前をコマンド ラインに入力ファイルとして追加します。 ( /conn オプションを使用して) 接続文字列にファイル名を含める操作は、サポートされていません。 詳しくは、「SqlMetal.exe (コード生成ツール)」をご覧ください。
クラス ライブラリ プロジェクト
オブジェクト リレーショナル デザイナーによって、プロジェクトの app.config
ファイルの中に接続文字列が作成されます。 クラス ライブラリ プロジェクトでは app.config
ファイルが使用されません。 LINQ to SQL は、デザイン時のファイルで提供される接続文字列を使用します。 app.config
内の値を変更しても、アプリケーションの接続先データベースは変更されません。
連鎖削除
LINQ to SQL は連鎖削除操作をサポートせず、認識もしません。 制約を持つテーブルの行を削除するには、次のいずれかを行う必要があります。
データベース内の外部キー制約で
ON DELETE CASCADE
規則を設定する。独自のコードを使用して、親オブジェクトの削除を妨げる子オブジェクトを最初に削除する。
このような操作を行わない場合、SqlException 例外がスローされます。
詳細については、行をデータベースから削除する」を参照してください。
クエリ可能でない式
「'型' の式はクエリ不可能です。LINQ プロバイダーに対してアセンブリ参照や名前空間インポートが不足していないことを確認してください」というエラーが発生した場合、次の点を確認してください。
アプリケーションが .NET Compact Framework 3.5 を対象としている。
System.Core.dll
およびSystem.Data.Linq.dll
への参照が存在する。System.Linq および System.Data.Linq のための
Imports
(Visual Basic) またはusing
(C#) ディレクティブが存在する。
DuplicateKeyException
LINQ to SQL プロジェクトのデバッグ時に、エンティティのリレーションシップを走査する場合があります。 その際、これらの項目はキャッシュに入り、LINQ to SQL はこれらの存在を認識します。 その後、同じキーの複数の行を生成する Attach や InsertOnSubmit などのメソッドを実行しようとした場合、DuplicateKeyException がスローされます。
文字列連結の例外
[n]text
と他の [n][var]char
にマップされる複数のオペランドを連結する操作はサポートされません。 異なる 2 つの型のセットにマップされる文字列を連結しようとすると、例外がスローされます。 詳細については、「System.String メソッド」を参照してください。
SQL Server 2000 の Skip 例外と Take 例外
SQL Server 2000 データベースに対して IsPrimaryKey または Take を使用する際には、ID メンバー (Skip) を使用する必要があります。 クエリは、(結合ではなく) 1 つのテーブルに対して実行されるか、Distinct、Except、Intersect、または Union 操作である必要があります。さらに、クエリに Concat 操作を含めることはできません。 詳細については、「標準クエリ演算子の変換」の「SQL Server 2000 のサポート」セクションを参照してください。
この要件は SQL Server 2005 には適用されません。
GroupBy InvalidOperationException
この例外は、たとえば GroupBy のように、boolean
式でグループ分けする group x by (Phone==@phone)
クエリ内の列値が null である場合にスローされます。 式が boolean
であるため、キーは nullable
boolean
ではなく、boolean
と推論されます。 変換された比較で null が生成される場合、nullable
boolean
を boolean
に割り当てようとして、例外がスローされます。
この状態を回避する (null を false と扱う) には、次のような手法を使用してください。
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() 部分メソッド
オブジェクト コンストラクターが呼び出されるたびに、生成されたメソッド OnCreated()
が呼び出されます。これは、元の値をコピーするために LINQ to SQL がコンストラクターを呼び出す場合にも当てはまります。 独自の部分クラスに OnCreated()
メソッドを実装する場合には、この動作を考慮に入れてください。