首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架和SQL Server视图

实体框架和SQL Server视图
EN

Stack Overflow用户
提问于 2009-06-18 15:23:03
回答 9查看 111.4K关注 0票数 137

出于几个我无权谈论的原因,我们在Sql Server 2005数据库上定义了一个视图,如下所示:

代码语言:javascript
复制
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来生成模型。有没有办法不让实体框架包含这个视图的任何字段作为主键?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-04-27 01:00:42

我们有同样的问题,下面是解决方案:

若要强制实体框架将列用作主键,请使用ISNULL。

若要强制实体框架不将列用作主键,请使用NULLIF。

应用它的一种简单方法是将视图的select语句包装在另一个select语句中。

示例:

代码语言:javascript
复制
SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp
票数 250
EN

Stack Overflow用户

发布于 2014-01-19 03:04:29

我能够使用设计器解决这个问题。

  1. 打开模型浏览器。
  2. 在图中找到视图,
  3. 右击主键,确保"Entity key“为所有非主键。使用Ctrl键或Shift键。Visual Studio.在“属性”窗口中(需要时按F4键查看),将“实体键”下拉菜单更改为False。
  4. 保存changes.
  5. Close
  6. 并重新打开它。我使用的是带有EF 6的Visual Studio2013,为了消除警告,我不得不这样做。

我不需要改变视图就可以使用ISNULL、NULLIF或COALESCE变通方法。如果您从数据库更新您的模型,警告将重新出现,但如果您关闭并重新打开VS,警告将消失。在设计器中所做的更改将被保留,不受刷新的影响。

票数 68
EN

Stack Overflow用户

发布于 2012-05-05 03:24:57

同意@Tillito的说法,但是在大多数情况下,它会破坏SQL优化器,并且不会使用正确的索引。

这对某些人来说可能是显而易见的,但我花了几个小时使用Tillito解决方案来解决性能问题。假设你有一张表:

代码语言:javascript
复制
 Create table OrderDetail
    (  
       Id int primary key,
       CustomerId int references Customer(Id),
       Amount decimal default(0)
    );
 Create index ix_customer on OrderDetail(CustomerId);

你的观点是这样的

代码语言:javascript
复制
 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,它将对主索引执行表扫描,但如果不是:

代码语言:javascript
复制
Group by CustomerId

您可以使用

代码语言:javascript
复制
Group by IsNull(CustomerId, -1)

它将使MS SQL (至少2008年)将正确的索引纳入计划。

如果

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1013333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档