为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架和SQL Server视图

实体框架和SQL Server视图

慕尼黑8549860 2019-08-09 16:13:07
实体框架和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


查看完整回答
反对 回复 2019-08-09
?
慕码人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年)包括正确的索引到计划中。

如果


查看完整回答
反对 回复 2019-08-09

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信