出于几个我无权谈论的原因,我们在Sql Server 2005数据库上定义了一个视图,如下所示:
CREATE VIEW [dbo].[MeterProvingStatisticsPoint]
AS
SELECT
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来生成模型。有没有办法不让实体框架包含这个视图的任何字段作为主键?
发布于 2010-04-27 01:00:42
我们有同样的问题,下面是解决方案:
若要强制实体框架将列用作主键,请使用ISNULL。
若要强制实体框架不将列用作主键,请使用NULLIF。
应用它的一种简单方法是将视图的select语句包装在另一个select语句中。
示例:
SELECT
ISNULL(MyPrimaryID,-999) MyPrimaryID,
NULLIF(AnotherProperty,'') AnotherProperty
FROM ( ... ) AS temp
发布于 2014-01-19 03:04:29
我能够使用设计器解决这个问题。
我不需要改变视图就可以使用ISNULL、NULLIF或COALESCE变通方法。如果您从数据库更新您的模型,警告将重新出现,但如果您关闭并重新打开VS,警告将消失。在设计器中所做的更改将被保留,不受刷新的影响。
发布于 2012-05-05 03:24:57
同意@Tillito的说法,但是在大多数情况下,它会破坏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年)将正确的索引纳入计划。
如果
https://stackoverflow.com/questions/1013333
复制相似问题