SQL Server视图可以有主键和外键吗?

时间:2009-04-13 20:46:22

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

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

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

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

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

  

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

您需要定义视图,以便:

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

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

  

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

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

  

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

     

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

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

关于第二个问题:

  

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

来自documentation

  

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

答案 1 :(得分: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 

答案 2 :(得分:-1)

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