2016-04-19 79 views
1

我有一個用於查詢兩個不同數據庫的EDMX(實體框架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聲明中刪除了最後四列,一切正常。

+0

有趣 - 我在EDMX中包含視圖時看到了這些,我不記得在桌面定義上有一個視圖。很棒的發現 - 很高興你能解決你的問題! – Borophyll

1

當您使用EDMX設計器並簡單地從實體中刪除一列時 - 這不會完全從EDMX中刪除該列。假設你真的希望它不見了,你可以用文本編輯器打開EDMX文件並手動刪除它。要確保手動更改觸發重建自動生成的類,請在Visual Studio中對其進行編輯,並且不應該有問題。

  1. 右鍵單擊EDMX在Solution Explorer中
  2. 打開方式...
  3. XML(文本)編輯器

,如果你要打開EDMX我希望,你會發現看起來像這樣的東西:

<EntityType Name="Person"> 
    <Property Name="FirstName" Type="varchar" /> 
    <Property Name="LastName" Type="varchar" /> 
    <Property Name="HomePhone" Type="varchar" /> 
    <Property Name="WorkPhone" Type="varchar" /> 
    <Property Name="MobilePhone" Type="varchar" /> 
    <Property Name="Email" Type="varchar" /> 
    <Property Name="Fax" Type="varchar" /> 
    <Property Name="ValidFromDate" Type="datetime" /> 
    <Property Name="ValidToDate" Type="datetime" /> 
    <Property Name="LastPulled" Type="datetime" /> 
    <Property Name="IsCurrent" Type="short" /> 
</EntityType> 

而你只是刪除底部的4列,保存並關閉,並重建項目。編輯:如果任何人在將來引用這個答案,如果你不先刪除設計器中的列(如在這種情況下的OP所做的),那麼將有兩個其他列的實例在您還需要刪除它才能編譯的XML。