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; }
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With