9

Entity Framework 5 (EF5) を使用して POCO から SQL Server CE 4.0 データベースを生成する .NET 切断型クライアント サーバー アプリケーションを構築しています。このアプリケーションにより、ユーザーはネットワーク SQL Server からクライアントの SQL Server CE データベースにデータの一括コピーを実行できます。これは、EF5 によって作成された制約とインデックスのために、非常に (非常に) 遅くなります。制約とインデックスを一時的に削除すると、30 分の待ち時間が 1 分以下に短縮されます。

一括コピーを開始する前に、アプリケーションはクエリを実行して、SQL Server CE テーブルから制約とインデックスを削除します。ただし、EF5 で作成された制約名にはテーブル スキーマ名、ドット、およびテーブル名が含まれているため、コマンドは失敗します。構文解析の問題が原因で、制約名のドットがドロップ コマンドの失敗の原因になっています。

たとえば、POCOは主キー制約を持つCustomerテーブルを作成します。データベースは期待どおりに動作します。dbo.CustomerPK_dbo.Customer_Id

ただし、クエリ以外の実行時:

 ALTER TABLE Customer DROP CONSTRAINT PK_dbo.Customer;

SQL Server Compact ADO.NET データ プロバイダーが次のエラーを返します。

クエリの解析中にエラーが発生しました。
[トークン ライン番号 = 1、トークン ライン オフセット = 57、トークン エラー = . ]

もちろん、DataContext外部キーを持たないセカンダリ オブジェクトを使用すると、制約なしでデータベースが生成され、後でそれらを追加できます。ただし、それには 2 つのDataContextオブジェクトを維持する必要があり、できれば両方を更新することを忘れないでください。したがって、次の 2 つの解決策のいずれかを探しています。

  1. DROP ステートメントは、. 文字が解析されます

  2. EF5 が を使用できないようにします。制約名とインデックス名の文字

よろしくお願いします。

4

1 に答える 1

14

その悪い子を [] で囲みます。内部のすべてがキー名であることをパーサーに伝えます。

ALTER TABLE Customer DROP CONSTRAINT [PK_dbo.Customer];

うまくいくはずです。個人的には、この正確な問題を回避するために、すべての識別子を括弧で囲みます。したがって、このクエリを次のように記述します。

ALTER TABLE [Customer] DROP CONSTRAINT [PK_dbo.Customer];

識別子がすぐにわかるので、その方が読みやすいと思います。

于 2013-08-09T05:03:24.257 に答える