我有一个EDMX(实体框架6.1.3),我用它来查询两个不同的数据库。数据库之间存在一些细微差别,但我只想要公共列。我从数据库A生成了EDMX,并从图中删除了不在数据库B中的列并重新生成了代码。
如果我查询数据库B,则查询包含我删除的列,尽管最终的SELECT没有。这意味着查询失败。
表格映射显示列,但在值/属性方面没有任何内容:
例外是:
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将不需要的列放入查询的任何部分?
答案 0 :(得分:1)
当您使用EDMX设计器并简单地从实体中删除列时 - 这不会从EDMX中完全删除该列。假设您确实希望它消失,您可以使用文本编辑器打开EDMX文件并手动将其删除。要确保手动更改会触发重建自动生成的类,请在Visual Studio中对其进行编辑,这样就不会出现问题。
我希望如果你打开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
语句中删除了最后四列,一切正常。