由于几个我无权谈论的原因,我们在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生成模型。有没有办法不让实体框架包含此视图的任何字段作为主键?

一般承认的答案

我们遇到了同样的问题,这就是解决方案:

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

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

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

例:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

热门答案

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

  1. 打开模型浏览器。
  2. 在图中查找视图。
  3. 右键单击主键,确保选中“Entity Key”。
  4. 多选所有非主键。使用Ctrl或Shift键。
  5. 在“属性”窗口中(如果需要,请按F4查看),将“实体键”下拉列表更改为False。
  6. 保存更改。
  7. 关闭Visual Studio并重新打开它。我正在使用带有EF 6的Visual Studio 2013,我必须这样做才能让警告消失。

我没有必要更改我的视图以使用ISNULL,NULLIF或COALESCE解决方法。如果您从数据库更新模型,警告将重新出现,但如果您关闭并重新打开VS,它将会消失。您在设计器中所做的更改将被保留,并且不会受到刷新的影响。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因