Linq to SQL dbmlファイルを更新するにはどうすればよいですか?


204

Linq to SQL .dbmlファイルを更新するにはどうすればよいですか?

回答:


258

モデルの同期を保つには3つの方法があります。

  1. 変更されたテーブルをデザイナーから削除し、データベースエクスプローラーからデザイナー画面にドラッグして戻します。これが確実に機能するためには、次のことが必要であることがわかりました。

    a。データベースエクスプローラーでデータベーススキーマを更新します(右クリック、更新)
    。テーブルを削除した後、デザイナーを保存します
    。テーブルをドラッグして戻した後、再度保存します。

    ただし、プロパティを変更した場合(たとえば、関連付けの子プロパティをオフにした場合)、これらの変更は明らかに失われるので、再度作成する必要があります。

  2. SQLMetalを使用して、データベースからスキーマを再生成します。私はこれをスクリプト化する方法を示す多くのブログ投稿を見てきました。

  3. DBMLの[プロパティ]ペインで直接変更します。これは、フィールドでnullを許可するなどの単純な変更で機能します。

DBMLデザイナは、Visual Studio 2015、2017、または2019にはデフォルトでインストールされていません。VSを閉じ、VSインストーラーを起動して、インストールを変更する必要があります。SQLツールへのLINQは、インストールしなければならない機能です。VS 2017/2019の場合は、[個別コンポーネント]> [コードツール]にあります


1
1aと1cを1bなしで試しましたが、ビューで単純な選択を実行すると、「指定されたキャストは有効ではありません」というエラーが発生しました。1bを含めると修正されました
tomfumb

6
VSのサポートが上要求されましたconnect.microsoft.com/VisualStudio/feedback/details/260723/...が、MSが修正する必要はありません。
Michael Freidgeim

最初の方法を試してみましたが、うまくいきました。小さなDBでうまくいくと思います。
Muhammedh 2014年

2019年の終わりに、コンピュータープログラミングとは何かを知る前に、回答を作成する必要があったのは大変です。これは非常に詳細ですばらしいものです。
PSGuy

54

.dbml-diagramのテーブルを、たとえば列を追加して更新するには、次のようにします。

  1. SQL Server Explorerウィンドウを更新します。
  2. テーブルの「新しい」バージョンを.dbml-diagram(下図のreport1)にドラッグします。

report1はテーブルの新しいバージョンです

  1. テーブルの新しいバージョンで追加された列をマークし、Ctrl+ Cを押して追加された列をコピーします。

追加した列をコピーする

  1. テーブルの「古い」バージョンをクリックし、Ctrl+ Vを押して、追加した列を既存のバージョンのテーブルに貼り付けます。

追加した列を古いバージョンのテーブルに貼り付けます


4
これは、追加のツールを必要とせず、VS2017で問題なく機能する最も簡単で破壊性の低い方法のようです
Toby

1
これは、受け入れられた回答よりもはるかに煩わしくなく、2018年の終わりまで引き続き機能します!
マーク

1
これは、迅速な(そしてスキーマへのそれほど迅速な編集ではない)ための最良の答えです。モデルビューの見栄えを良くするために多くの時間を費やしました。更新ファイルを削除してドラッグするのが嫌いでした。追加されたフィールドの場合、これはうまくいきます!
ハッカー、

1
私にとって、これは2つの問題を解決しました。1つ目は、テーブル内の同様のフィールドをコピーして貼り付け、名前を変更しようとしたときです。検証時に、停止しない「指定されていない」ビルドエラーが発生しました。もう1つの問題は、テーブルを削除してから全体を追加し直した場合、gitではるかに大きな違いが生じることでした(オブジェクトがファイル内で再配置されたため)。この方法では、新しいフィールドの挿入のみが表示されます。これは、後でより明確で理解しやすくなります。
18

ところで、「デザイナーに追加しているオブジェクトはデザイナーとは異なるデータ接続を使用しています...」というメッセージが表示されたら「はい」をクリックする必要があります
Eitanmg

5

また、CodeSmithに基づくコード生成テンプレートのPLINQOセットをチェックアウトすることもできます。これにより、Linq-to-SQLのために、Linq-to-SQLで多くの優れた機能を実行できます。

  • クラスごとに1つのファイルを生成する(単一の巨大なファイルではなく)
  • 必要に応じてモデルを更新する
  • より多くの機能

PLINQOのサイト(http://www.plinqo.com) をチェックして、紹介ビデオを ご覧ください

私が知っている2番目のツールはHuagati DBML / EDMXツールで、DBML(Linq-to-SQL)およびEDMX(Entity Framework)マッピングファイルなどの更新を可能にします(命名規則など)。

マーク


CodeSmith / PLINQOを削除したばかりなので、このアプローチをとらないことを強くお勧めます。この回答は4年以上前のものだと認められました...
Yuck

@Yuck:現時点では、Linq-to-SQLを使用しないことを強くお勧めします-代わりにEntity Frameworkを使用してください。
marc_s 2013

はい、そうです。アプリケーションがPLINQOではなくプレーンDBMLで動作することを確認してからEFに移行することは、私が古いアプリケーションを整理するための次のステップでした。
Yuck

4

すべての.DBMLファイル内の各テーブルのinformation_schemaモデルを動的にクエリし、.DBMLファイルの一部をデータベースからの新しいスキーマ情報で上書きするカスタムのT4テンプレートを使用します。私は非常にこのようなソリューションを実装することをお勧めします。これにより、時間を大幅に節約でき、テーブルを削除してモデルに再度追加するのとは異なり、関連付けを維持できます。このソリューションでは、スキーマが変更されるとコンパイル時エラーが発生します。ただし、バージョン管理システムを使用していることを確認する必要があります。これは、比較が非常に便利だからです。これは、DBスキーマの最初のアプローチで開発している場合にうまく機能する優れたソリューションです。もちろん、私は私の会社のコードを共有することはできませんので、あなたは自分でこれを自分で書くことに専心しています。しかし、いくつかのLinq-to-XMLを知っていて、このプロジェクトで学校に通うことができれば、自分がなりたい場所にたどり着くことができます。


2

dbmlを更新すると、生成されたコードも更新されるため、VS2008に組み込まれているビジュアルデザイナーを使用することをお勧めします。ビジュアルデザイナーの外部でdbmlを変更すると、基になるコードが同期しなくなります。


4
そうですが、VS2008のビジュアルデザイナーは、基になるデータベースの変更を検出して応答することはできません:-(削除して再追加しない
限り

それは事実ですが、質問は非常にあいまいであり、データベースが変更されたときにモデルを更新する方法については特に言及していません。
Jason Miesionczek、2009

2

テーブルを更新してからDBMLを更新するニュアンスがあります...既存のテーブルに変更が加えられた場合、外部キーの関係がすぐに反映されるとは限りません。回避策は、プロジェクトのビルドを実行してから、テーブルを再度追加することです。これをMSに報告し、VS2010で修正されました。

DBML表示に新しい外部キー制約が表示されない


主な回答で与えられた指示は明確ではないことに注意してください。テーブルを更新するには

  1. dbmlデザインサーフェイスを開く
  2. 右->クリック->すべて選択ですべてのテーブルを選択するか CTRLa
  3. CTRLx (切る)
  4. CTRLv (ペースト)
  5. ソリューションを保存して再構築します。

関連するconnect.microsoft.com/VisualStudio/feedback/details/414601/…が修正されていないため、修正されたとは思いません
Michael Freidgeim

カットアンドペーストの前または後に変更を行いますか?
コロブキャニオン

10年経っています...しかし、それは以前のことだと思います...変更を行ってから#2に進みます。
ΩmegaMan

1

ストアドプロシージャの更新の場合は、.dbmlファイルから削除し、再度挿入する必要があります。ただし、ストアドプロシージャに2つのパスがある場合(例:何かがある場合、一部の列を表示するか、他のいくつかの列を表示する場合)、2つのパスに同じ列のエイリアスがあることを確認してください!!! それ以外の場合は、最初のパス列のみが存在します。


0

これは、LINQ to SQL dbmlと関連ファイルを更新して、データベーステーブルの1つに追加した新しい列を含めるために機能した完全な段階的な方法です。

上記で提案されているように、デザインサーフェイスを変更する必要があります。ただし、いくつかの追加手順を実行する必要があります。これらは完全なステップです:

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.