实体框架和SQL Server视图由于几个我无权谈论的原因,我们在Sql Server 2005数据库中定义了一个视图,如下所示:CREATE VIEW [dbo].[MeterProvingStatisticsPoint]ASSELECT
CAST(0 AS BIGINT) AS 'RowNumber',
CAST(0 AS BIGINT) AS 'ProverTicketId',
CAST(0 AS INT) AS 'ReportNumber',
GETDATE() AS 'CompletedDateTime',
CAST(1.1 AS float) AS 'MeterFactor',
CAST(1.1 AS float) AS 'Density',
CAST(1.1 AS float) AS 'FlowRate',
CAST(1.1 AS float) AS 'Average',
CAST(1.1 AS float) AS 'StandardDeviation',
CAST(1.1 AS float) AS 'MeanPlus2XStandardDeviation',
CAST(1.1 AS float) AS 'MeanMinus2XStandardDeviation'WHERE 0 = 1我们的想法是,实体框架将基于此查询创建一个实体,但它会生成一个包含以下内容的错误:警告6002:表/视图'Keystone_Local.dbo.MeterProvingStatisticsPoint'没有定义主键。已推断密钥,并将定义创建为只读表/视图。并且它决定CompletedDateTime字段将是此实体主键。我们正在使用EdmGen生成模型。有没有办法不让实体框架包含此视图的任何字段作为主键?
3 回答
萧十郎
TA贡献1815条经验 获得超13个赞
我们遇到了同样的问题,这就是解决方案:
要强制实体框架使用列作为主键,请使用ISNULL。
要强制实体框架不使用列作为主键,请使用NULLIF。
一种简单的方法是将视图的select语句包装在另一个select中。
例:
SELECT ISNULL(MyPrimaryID,-999) MyPrimaryID, NULLIF(AnotherProperty,'') AnotherProperty FROM ( ... ) AS temp
慕码人8056858
TA贡献1803条经验 获得超6个赞
但在大多数情况下,它会破坏SQL优化器,它不会使用正确的索引。
这对某些人来说可能是显而易见的,但是我花了几个小时使用Tillito解决方案来解决性能问题。让我们说你有桌子:
Create table OrderDetail ( Id int primary key, CustomerId int references Customer(Id), Amount decimal default(0) ); Create index ix_customer on OrderDetail(CustomerId);
你的观点是这样的
Create view CustomerView As Select IsNull(CustomerId, -1) as CustomerId, -- forcing EF to use it as key Sum(Amount) as Amount From OrderDetail Group by CustomerId
Sql优化器不会使用索引ix_customer,它会对主索引执行表扫描,但是如果不是:
Group by CustomerId
你用
Group by IsNull(CustomerId, -1)
它将使MS SQL(至少2008年)包括正确的索引到计划中。
如果
- 3 回答
- 0 关注
- 557 浏览
添加回答
举报
0/150
提交
取消