实体框架和SQL Server视图

实体框架和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生成模型。有没有办法不让实体框架包含此视图的任何字段作为主键?


慕尼黑8549860
浏览 558回答 3
3回答

萧十郎

我们遇到了同样的问题,这就是解决方案:要强制实体框架使用列作为主键,请使用ISNULL。要强制实体框架不使用列作为主键,请使用NULLIF。一种简单的方法是将视图的select语句包装在另一个select中。例:SELECT   ISNULL(MyPrimaryID,-999) MyPrimaryID,   NULLIF(AnotherProperty,'') AnotherProperty  FROM ( ... ) AS temp

慕码人8056858

但在大多数情况下,它会破坏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 CustomerIdSql优化器不会使用索引ix_customer,它会对主索引执行表扫描,但是如果不是:Group by CustomerId你用Group by IsNull(CustomerId, -1)它将使MS SQL(至少2008年)包括正确的索引到计划中。如果
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server