Подтвердить что ты не робот

Почему Entity Framework пытается выбрать все столбцы, хотя я указал только два?

Я унаследовал проект ASP MVC, который использует Entity Framework 6.1.3 для взаимодействия с базой данных SQL Dynamics CRM 2011.

Я использую этот запрос, чтобы попытаться получить все активные учетные записи, у которых есть номер учетной записи, и я выбираю только два столбца в анонимный тип:

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

(context является DbContext, Accounts является DbSet<Account>, Account имеет ВСЕ поля, которые были определены, включая те, которые были удалены с момента создания проекта. Они были созданы EF.)

При выполнении запроса я получаю следующее исключение:

Недопустимое имя столбца "Opportunity_1", "Opportunity_2",..., "Opportunity_7"

Все упомянутые столбцы - это те, которые были удалены из базы данных с момента создания этого проекта.

Ошибка возникает из-за того, что SQL-запрос, выполняемый EF, выглядит следующим образом:

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 требуемых столбца и игнорировать остальные: один/два/три

Я хочу избежать необходимости регенерировать всю схему/модель/что угодно из базы данных, или я бы сделал это каждый раз, когда я внес изменения в базу данных.

Можно ли выбрать только эти 2 столбца из базы данных и игнорировать все остальные или это только то, как работает 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; }
    }
}
4b9b3361

Ответ 1

Когда вы создаете сущности и удаляете определенные столбцы, где раньше было сопоставлено, EF будет использовать эту ссылку и попытается найти столбцы на основе сущностей, а не по запросу, который вы сделали.

Быстрое решение, удалите объект проекта построения таблицы и добавьте его снова в модель emdx и снова восстановите.

альтернативно удалите все столбцы из удаляемого dbконтекста.

Ответ 2

Использовать атрибут не привязанный к полям модели, которые вам не нужны в BD