9

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

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

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

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

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

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

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

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

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

4

3 回答 3

7

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

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

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

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

它不能更新。对于只读实体,这里的解决方案:

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

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

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

对于第二个问题:

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

文档

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

于 2009-04-13T20:53:01.640 回答
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 
于 2011-08-11T15:13:36.800 回答
-1

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

于 2010-12-10T14:52:53.167 回答