LINQ-to-SQL が select ステートメントを生成し、サーバーからの応答を受信するまで、例外は発生しません。また、サーバーが予期しない応答 (フィールドの異なるデータ型など) を返した場合でも、コードでそのフィールドを積極的に使用するまで例外は発生しません。
そうです、列を問題なく追加できます。列は DBML に認識されないため、生成されたクエリは列を参照しないためです。Linq-To-SQL は を送信SELECT * FROM TABLE
することはなく、実行時に SQL Server でデータベース スキーマを送信SELECT [ID], [COL1], [COL2] FROM TABLE
したり検証したりしません。したがって、特定の [COL3] が存在するかどうかは、結果に違いはありません。
もう少し実験してみてください (お勧めできる方法ではありません)。DBML の一部である列を削除および変更して、何が機能するかを確認してみましょう。
[Col2] を削除すると、サーバーが [col2] を含む各行のすべてのフィールドを取得しようとするため、「無効な列名」エラーが生成されます。
var q = from row in table
select row;
int id = q.First().id;
ただし、開発中に定期的に変更する予定がある場合は、必要なフィールドのみを取得することで、このようなエラーの発生を防ぐことができます。[Col2] を参照していないため、これは機能します。
var q = from row in table
select new { row.id, row.Col1 };
int id = q.First().id;
そして少し驚くべきことに、Col2 をそのままにして、そのデータ型を完全に異なるもの (datetime など) に変更すると、これは機能することさえあります。
var q = from row in table
select new { row.id, row.Col1, row.Col2 };
int id = q.First().id;
それが機能しないのは、フィールドを積極的に使用する場合のみです:(「Nullableオブジェクトには値が必要です。」というメッセージが表示されます)。
var q = from row in table
select row;
var col2 = q.First().Col2;
新しい不明な列が null 可能である限り、行を挿入することもできます。新しい Col4 を作成したとしましょう。これはまだ機能します。
table.InsertOnSubmit(new table() { id = 1, col1 = 'A' };
table.SubmitChanges();
ただし、列のデータ型を変更すると、null 値を渡すだけでも行を挿入できなくなるので注意してください。Col1 が DBML の文字列であるが、データベースで datetime に変更した場合、Linq-To-SQL はすべてのフィールドに対して適切な挿入ステートメントを生成するため、これは機能しません: ('Implicit data type conversion not allowed')
table.InsertOnSubmit(new table() { id = 2 };
table.SubmitChanges();
要約すると、SQL ステートメント LINQ-To-SQL をデータベースで直接実行しても有効であり、受信したデータが DBML と矛盾しない限り、コードが壊れることはありません。