为什么Entity Framework尝试SELECT所有列,即使我只指定了两个?

时间:2017-03-08 11:29:41

标签: c# sql-server asp.net-mvc entity-framework

我继承了一个ASP MVC项目,该项目使用Entity Framework 6.1.3与Dynamics CRM 2011 SQL数据库进行交互。

我使用此查询尝试获取所有具有帐号的活动帐户,并且我只选择两列为匿名类型:

var results = context.Accounts
              .Where(a => (a.AccountNumber != null) 
                       && (a.StateCode == (int)AccountState.Active))
              .Select(a => new 
              { 
                  a.AccountId, 
                  a.AccountNumber 
              });

contextDbContextAccountsDbSet<Account>Account定义了所有字段,包括自项目创建以来删除的字段。由EF生成。)

执行查询时,我得到以下异常:

  

无效的列名称&#34; Opportunity_1&#34;,&#34; Opportunity_2&#34;,...,&#34; Opportunity_7&#34;

提到的所有列都是自创建此项目以来已从数据库中删除的列。

发生错误是因为EF运行的SQL查询实际上如下所示:

SELECT     
    [Extent1].[StateCode] AS [StateCode],     
    [Extent1].[AccountId] AS [AccountId],     
    [Extent1].[AccountNumber] AS [AccountNumber]   

FROM (SELECT     
        [Account].[AccountId] AS [AccountId],     
        [Account].[AccountNumber] AS [AccountNumber],     
        ...
        !! EVERY SINGLE COLUMN !!
        ...
        [Account].[Opportunity_1] AS [Opportunity_1], // These have been deleted
        [Account].[Opportunity_2] AS [Opportunity_2]  // from the database

      FROM [dbo].[Account] AS [Account]) AS [Extent1] 

 WHERE ([Extent1].[AccountNumber] IS NOT NULL) AND (0 = [Extent1].[StateCode])

我没想到它会尝试选择每一列,显然因为字段已经从数据库中删除而不是模型我得到了错误。

我已经阅读了几篇帖子,这些帖子表明我的查询看起来是正确的,并且它应该只选择3个必需列并忽略其余列: one / two / three

我希望避免重新生成整个架构/模型/数据库中的任何内容,或者我每次对数据库进行更改时都会发现自己这样做。

是否可以从数据库中仅选择这两列并忽略所有其他列,或者这只是EF的工作方式,我每次都会更新模型并重新部署项目?

以下是整个DbContext模型:

namespace AccountMarker.Models
{
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class CRMEntities : DbContext
    {
        public CRMEntities()
            : base("name=CRMEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Account> Accounts { get; set; }
    }
}

2 个答案:

答案 0 :(得分:2)

当您创建实体并删除之前映射的特定列时,EF将获取相同的引用,并将尝试根据实体查找列,而不是查询您的查询。

快速解决方案,删除表构建项目的实体并将其再次添加到emdx模型中并重新重建。

或者从dbcontext中删除所有已删除的列。

答案 1 :(得分:0)

在BD

中不需要的模型字段上使用not mapped属性