EF 6查询包含未映射的列,违反了查询

时间:2016-04-19 16:46:37

标签: entity-framework entity-framework-6

我有一个EDMX(实体框架6.1.3),我用它来查询两个不同的数据库。数据库之间存在一些细微差别,但我只想要公共列。我从数据库A生成了EDMX,并从图中删除了不在数据库B中的列并重新生成了代码。

如果我查询数据库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将不需要的列放入查询的任何部分?

2 个答案:

答案 0 :(得分:1)

当您使用EDMX设计器并简单地从实体中删除列时 - 这不会从EDMX中完全删除该列。假设您确实希望它消失,您可以使用文本编辑器打开EDMX文件并手动将其删除。要确保手动更改会触发重建自动生成的类,请在Visual Studio中对其进行编辑,这样就不会出现问题。

  1. 右键单击解决方案资源管理器中的EDMX
  2. 打开......
  3. XML(文本)编辑器
  4. 我希望如果你打开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才能进行编译。

答案 1 :(得分: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语句中删除了最后四列,一切正常。