Entity framework EF 6查询包含未映射的列,导致查询中断

Entity framework EF 6查询包含未映射的列,导致查询中断,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我有一个EDMX(EntityFramework 6.1.3),用于查询两个不同的数据库。数据库之间有一些细微的差别,但我只想要公共列。我从数据库A生成了EDMX,从图中删除了数据库B中没有的列,并重新生成了代码 如果查询数据库B,则查询包含我删除的列,尽管最终选择不包含。这意味着查询失败 表映射显示了列,但在值/属性端没有显示任何内容: 例外情况是: System.Data.Entity.Core.EntityCommandExecutionException : An error occu

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

如果查询数据库B,则查询包含我删除的列,尽管最终选择不包含。这意味着查询失败

表映射显示了列,但在值/属性端没有显示任何内容:

例外情况是:

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将不需要的列放入查询的任何部分?

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

  • 在解决方案资源管理器中的EDMX上单击鼠标右键
  • 打开与
  • 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中还有两个列实例需要删除,以便进行编译。

    感谢@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>
    
    
    挑选
    [Person].[FirstName]作为[FirstName],
    [Person].[LastName]作为[LastName],
    [个人]。[家庭电话]作为[家庭电话],
    [个人].[工作电话]作为[工作电话],
    [个人]。[手机]作为[手机],
    [个人][电子邮件]作为[电子邮件],
    [人][传真]作为[传真],
    【人员】【生效日期】为【生效日期】,
    [人][有效日期]作为[有效日期],
    [Person].[LastPull]作为[LastPull],
    [个人][IsCurrent]作为[IsCurrent]
    来自[dbo].[Person]作为[Person]
    
    这就是奇怪的子查询的来源。我认为原因是表没有主键,因为它是临时数据库的一部分


    我刚刚从
    SELECT
    语句中删除了最后四列,所有内容都正常工作。

    有趣的是,我在EDMX中包含视图时看到过这些,我不记得在表定义中有视图。伟大的发现-很高兴你能解决你的问题!