Entity framework EF 6查询包含未映射的列,导致查询中断
我有一个EDMX(EntityFramework 6.1.3),用于查询两个不同的数据库。数据库之间有一些细微的差别,但我只想要公共列。我从数据库A生成了EDMX,从图中删除了数据库B中没有的列,并重新生成了代码 如果查询数据库B,则查询包含我删除的列,尽管最终选择不包含。这意味着查询失败 表映射显示了列,但在值/属性端没有显示任何内容: 例外情况是: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
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中对其进行编辑,这样就不会出现问题
<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中包含视图时看到过这些,我不记得在表定义中有视图。伟大的发现-很高兴你能解决你的问题!