问题已通过新的见解得到解决。在尝试构建演示代码以与 SO 社区共享时,我意外地找到了解决方案,因为我需要清理敏感数据(模型)部分。请让我详细说明问题所在。
解决方案可以分为两种解决方案:
我将就这两个问题分享一些见解。
数据库项目/解决方案的配置
Visual Studio 解决方案包含一个项目,其中放置了所有视图。实际表和其他数据库项目在不同的解决方案/项目中分开。
Solution1
Project1
View1
View2
View3
Solution2
Project1
Tables
Security
Schemas
Etc...
视图本身包含三部分标识符 [Database].[Schema].[Table/View]。这既适用于项目内的项目(视图),也适用于项目外的项目(表等)。
仅使用仅包含视图的单独项目会导致缺少参考。它无法找到其他视图或表格(进一步参见参考资料)。
这个问题的一个解决方案是确保引用的视图和表都在同一个解决方案/项目中。即使使用三部分标识符,Visual Studio 也会忽略这些,因为同一项目/解决方案中存在所有项目。它将以这种方式检测依赖关系。
参考的工作方式
解决它的另一种方法是在视觉工作室中以正确的方式使用引用。这是第二种可能的解决方案。
考虑前面的示例,其中视图位于不同的解决方案中,因为其他元素导致缺少引用。但是,使用相同数据库设置添加 dacpac 作为数据库引用会导致引用冲突,并且模型中已经存在 SQL71508 元素。这是真的,因为它存在于引用 dacpac 中,我们尝试在 dacpac 中创建一个具有相同名称引用自身的新视图。这是因为它将三部分引用视为 dacpac 的变量。
当对同一服务器、不同数据库使用 dacpac 设置时,它会解析混合引用,因为它将三部分标识符视为外部引用,并认为您创建了查看外部 dacpac 的视图的本地副本。换句话说,它不会检测到嵌套视图,因为它认为您引用了一个不在项目内部的单独数据库。
在构建项目时,这不会导致错误并且部署将起作用。但是,由于它认为您正在引用外部数据源(以 dacpac 的形式),因此它看不到对其他本地视图的引用。
解决这个问题(至少这对我们有用)是当我们需要对其他视图的本地引用时,在我们的视图中使用两部分标识符。这样,它将查看项目中的其他文件,而不是引用的 dacpac。
由于它将检测对其他本地视图的引用,因此它将正确构建并检测本地项目内视图中的依赖关系。然后它将为所有视图创建一个良好的构建顺序。
我想您也可以为引用的 Dacpac 分配一个不同的变量名称,一直使用三部分标识符,但将外部 dacpac 中的变量更改为使用新分配的变量名称。我们还没有测试过这个(但我今晚回家时会测试)。
因此,在使用部分项目或将数据库拆分为多个项目/解决方案时,总而言之,这是一个很好的学习经验,了解数据库引用如何在数据库项目中工作。现在要了解这个潘多拉的黑匣子并将它们转换为面向未来的解决方案:)