2016-04-19 6 views
1

2つの異なるデータベースを照会するために使用しているEDMX(Entity Framework 6.1.3)があります。データベース間には若干の違いがありますが、共通の列のみが必要です。データベースAからEDMXを生成し、ダイアグラムからデータベースBにない列を削除し、コードを再生成しました。EF 6クエリにマッピングされていない列が含まれており、クエリが破損しています

データベースBをクエリすると、クエリには削除された列が含まれますが、最終的なSELECTには含まれません。これは、クエリが失敗することを意味します。

テーブル・マッピングが列を示しているが、値/プロパティの側に何も:

Removed properties from mapping

例外は次のとおりです。

System.Data.Entity.Core.EntityCommandExecutionException : An error occurred while executing the command definition. See the inner exception for details. 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'ValidFromDate'. 
Invalid column name 'ValidToDate'. 
Invalid column name 'LastPulled'. 
Invalid column name 'IsCurrent'. 

サーバーに送信されたクエリ次のとおりです。

SELECT TOP (1) 
[c].[FirstName] AS [FirstName], 
[c].[LastName] AS [LastName], 
[c].[HomePhone] AS [HomePhone], 
[c].[WorkPhone] AS [WorkPhone], 
[c].[MobilePhone] AS [MobilePhone], 
[c].[Email] AS [Email], 
[c].[Fax] AS [Fax] 
FROM (SELECT 
[Person].[FirstName] AS [FirstName], 
[Person].[LastName] AS [LastName], 
[Person].[HomePhone] AS [HomePhone], 
[Person].[WorkPhone] AS [WorkPhone], 
[Person].[MobilePhone] AS [MobilePhone], 
[Person].[Email] AS [Email], 
[Person].[Fax] AS [Fax], 
[Person].[ValidFromDate] AS [ValidFromDate], 
[Person].[ValidToDate] AS [ValidToDate], 
[Person].[LastPulled] AS [LastPulled], 
[Person].[IsCurrent] AS [IsCurrent] 
FROM [dbo].[Person] AS [Person]) AS [c] 

ご覧のとおり追加の列を含む内部クエリ。

この時点で、なぜこのようなことが起こっているのかわかりません。マッピングの両側からこれらの列を削除する方法、またはEFが不要な列をクエリの任意の部分に配置しないようにする方法はありますか。

答えて

1

@Borophyllのおかげで私はほぼ正しい方向に向いています。彼らの答えは私の問題の解決策ではありませんでしたが、実際の問題を見ることができました。 EDMXファイル内

も、このようなエントリがあります:

<EntitySet Name="Person" EntityType="Self.Person" store:Type="Tables" store:Schema="dbo"> 
    <DefiningQuery>SELECT 
    [Person].[FirstName] AS [FirstName], 
    [Person].[LastName] AS [LastName], 
    [Person].[HomePhone] AS [HomePhone], 
    [Person].[WorkPhone] AS [WorkPhone], 
    [Person].[MobilePhone] AS [MobilePhone], 
    [Person].[Email] AS [Email], 
    [Person].[Fax] AS [Fax], 
    [Person].[ValidFromDate] AS [ValidFromDate], 
    [Person].[ValidToDate] AS [ValidToDate], 
    [Person].[LastPulled] AS [LastPulled], 
    [Person].[IsCurrent] AS [IsCurrent] 
    FROM [dbo].[Person] AS [Person]</DefiningQuery> 
</EntitySet> 

そして奇妙なサブクエリが来ていたところです。理由は、ステージングデータベースの一部であるため、テーブルにはプライマリキーがないということです。

私はちょうどSELECTの文から最後の4つの列を削除し、すべてが働きました。

+0

興味深い - 私はEDMXでビューを含む場合、私はテーブル定義の1つを有する覚えていないこれらを見てきました。素晴らしい発見 - あなたの問題を解決できたことをうれしく思います! – Borophyll

1

EDMXデザイナを使用してエンティティから列を削除するだけでは、EDMXから列が完全に削除されません。本当に消えたかったら、EDMXファイルをテキストエディタで開き、手で取り除くことができます。手動による変更によって自動生成されたクラスの再構築がトリガーされるようにするには、Visual Studioで編集してください。問題はありません。

  1. 右クリックしEDMXソリューションエクスプローラで
  2. 開く...
  3. XML(テキスト)エディタ

を私はあなたがEDMXを開くとしたら、あなたは見つけるだろう期待

そして、下の4列を削除して、プロジェクトを保存して閉じてから再構築するだけです。

EDIT:この回答を今後誰かが参照する場合は、OPのようにデザイナーの列を最初に削除しないと、その列の2つのインスタンスがそれをコンパイルするために削除する必要のあるXML

関連する問題