我继承了一个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
});
(context
是DbContext
,Accounts
是DbSet<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; }
}
}
答案 0 :(得分:2)
当您创建实体并删除之前映射的特定列时,EF将获取相同的引用,并将尝试根据实体查找列,而不是查询您的查询。
快速解决方案,删除表构建项目的实体并将其再次添加到emdx模型中并重新重建。
或者从dbcontext中删除所有已删除的列。
答案 1 :(得分:0)
在BD
中不需要的模型字段上使用not mapped属性