2

当基于 PIVOT 查询创建视图时,所有视图字段在视图元数据中都变为 NULLABLE,有没有办法使它们不为空?

我在需要为 NOT NULL 的透视字段中使用 NVL 函数,但它们仍然变为 NULLABLE。

这对我来说是个问题,因为我使用的是 MS Entity Framework,它不会根据没有 NOT NULLABLE 列的表或视图更新模型。

4

4 回答 4

1

@Miguel,我不知道“MS Entity Framework”,但这个名字听起来像是一个面向编辑数据的框架。“实体”通常用于构建数据库数据的缓存,以准备将数据更改和更新回数据库。这似乎不是您想要做的。

重新阅读这个问题,我相信您有某种枢轴生成器正在使用来为用户即时创建视图。因此,您不打算修改实体模型。我认为您根本不需要实体模型。

实体框架可能会寻找 NOT NULL 列,以便找到它可以使用的“主键”或其他行级标识符。为什么要这些?

  • 提供可用于更新任何行的密钥
  • 提供对结果集进行分页的键
  • 提供支持对结果集进行内存过滤的密钥
  • 支持对结果集进行动态排序操作

我还推测您有某种 UI 控件可以很好地呈现“实体”集合,因此您想使用该控件。

控件可能不需要“实体” - 检查它的接口是什么。也许有一个实体的超类或一个您可以生成的接口,而不是一个可更新的实体。如果你能做到这一点,你应该能够在漂亮的 UI 控件中呈现它,而不是用你的 NULLABLE 列撞墙。

于 2013-01-29T16:24:00.150 回答
0

您需要在 Visual Studio (VS) 中更新您的模型。因为这不知道每一列中的类型信息是什么。然后你必须在数据透视表的查询中指定数据类型。例如,使用 to_number 指定显式转换。当您要在 VS 中更新模型时,您必须基于例如物化视图(具有明确定义的数据类型)。请使用基于数据透视表的明确定义的数据类型创建物化视图(这不仅必须包含 nvl 函数,还必须包含定义的数据类型、字符串、数字等),然后更新您的模型。只有物化视图?不,它可以是一张桌子(但很麻烦)。可以直接来自数据透视表吗?并不总是有效(如您的情况)。重要的是有定义的数据类型。

于 2013-01-29T15:58:54.193 回答
0

一种可能的解决方案是根据查询结果动态生成一个新表,并在此之后对该表进行调整约束。对于太多动态 SQL,我不喜欢这种方法 :)

另一种解决方案是预先构建的物化视图。在此处(Oracle 文档)查看“ON PREBUILT TABLE Clause”。

于 2013-01-28T13:19:22.037 回答
0

如果您不需要很多这些视图,您可以使用代码优先,Scott Gu 有一篇很好的文章“Code first with existing database”展示了如何做到这一点。

这可能需要有 2 种方法来访问数据库,这可能对您有用,也可能不适合您。

于 2013-02-01T10:53:25.520 回答