Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Entity Framework try to SELECT all columns even though I have specified only two?

I've inherited an ASP MVC project that uses Entity Framework 6.1.3 to interact with a Dynamics CRM 2011 SQL database.

I'm using this query to try and get all active accounts that have an account number and I'm selecting only two columns into an anonymous type:

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

(context is the DbContext, Accounts is a DbSet<Account>, Account has ALL fields defined including ones deleted since the project was created. These were generated by EF.)

When executing the query I get the following exception:

Invalid column name "Opportunity_1", "Opportunity_2", ... , "Opportunity_7"

All of the columns mentioned are the ones that have been removed from the database since this project was created.

The error occurs because the SQL query that EF runs actually looks like this:

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])

I didn't expect it to try and select every single column, obviously since fields have been deleted from the database but not the model I get the error.

I've read several posts that indicate that my query looks correct and that it should only select the 3 required columns and ignore the rest: one / two / three

I want to avoid having to regenerate the whole schema/model/whatever from the database or I'd find myself doing this every time I made a change to the database.

Is it possible to select only these 2 columns from the database and ignore all others or is this just how EF works and I'll have the update the model and redeploy the project each time?


Here is the entire DbContext model:

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; }
    }
}
like image 395
Equalsk Avatar asked Mar 08 '17 11:03

Equalsk


1 Answers

When you create entities and delete the specific columns which where mapped earlier, EF will took the reference for same and will try to find the columns based on entities and not on query you made.

Quick solution, remove the entity of table build project and add it again into emdx model and rebuilt again.

alternatively remove all the columns form the dbcontext that are deleted.

like image 131
user7417866 Avatar answered Sep 21 '22 14:09

user7417866