Я унаследовал проект 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; }
}
}