【问题标题】:Can SQL Server views have primary and foreign keys?SQL Server 视图可以有主键和外键吗?
【发布时间】:2010-10-19 05:20:47
【问题描述】:

是否可以在 Microsoft SQL Server Management Studio 中为数据库视图定义主键和外键?怎么样?

我正在尝试创建一个 ADO.NET 实体数据模型来读取四个我无法修改的旧的、格式不正确的数据库表。我只创建了我需要的数据的视图。

这四个视图应该映射到一个简单的三实体 EDMX,具有多对多的关系。

创建数据模型时出现此错误:

表/视图“...”没有 主键已定义且无效 可以推断出主键。这 表/视图已被排除。使用 您需要审查的实体 您的架构,添加正确的键和 取消注释。

它正确地推断出两个视图的主键。但其他两个都没有这样做。

我的一个问题视图使用聚合函数:

SELECT MAX(...) ... GROUP BY ...

另一个应该有两个外键的复合主键。

【问题讨论】:

标签: .net sql-server entity-framework database-design ado.net-entity-data-model


【解决方案1】:

您需要定义您的视图,以便它:

  • 包括所有 PRIMARY KEY
  • 不使用任何JOIN
  • 不使用任何聚合函数或UNION's

您视图中的任何行都应映射到表格中的一行。

我的一个问题视图使用聚合函数

它无法更新。对于只读实体,来自here的解决方案:

当无法推断出任何键时,将包含相应 EntityType 元素(没有键元素)的代码注释添加到 .edmx 文件的 SSDL 部分。

在您的情况下,由于您似乎想要一个只读实体,您可以:

  1. 取消注释 SSDL 实体
    • 将一个/一些属性标记为 Nullable="False"
    • 添加适当的关键元素
    • 添加相应的定义查询。

第二个问题:

另一个应该有两个外键的复合主键

来自documentation

表示数据库中两个表之间的多对多关系的表在概念架构中可能没有等效实体。当EDM 工具遇到这样的表时,除了作为外键的两个列之外没有其他列时,映射表在概念架构中表示为多对多关联而不是实体。

【讨论】:

  • 因为我无法在视图之间定义外键约束(可以吗?),Visual Studio 无法创建我想要的多对多关系。
  • 谢谢。我正在研究自动生成的 EDMX XML 文件并试图理解它。
  • 您可以在基础表之间定义外键约束,EDM 工具应该能够获取它们。还要确保视图中除了两个外键之外没有其他列。
【解决方案2】:

您可以通过在视图中创建NOT NULL 索引列来更改视图,执行如下操作:

ALTER VIEW [dbo].[ViewName]
AS
    SELECT  ISNULL(CAST(CASE ROW_NUMBER() OVER ( ORDER BY columnNames )
                          WHEN ROW_NUMBER() OVER ( ORDER BY columnNames )
                          THEN ROW_NUMBER() OVER ( ORDER BY columnNames )
                          ELSE 0
                        END AS INT), 0) AS ID 

【讨论】:

    【解决方案3】:

    实际上,您可以创建一个使用 JOIN 的视图并从中生成模型中的实体。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多