当基于 PIVOT 查询创建视图时,所有视图字段在视图元数据中都变为 NULLABLE,有没有办法使它们不为空?
我在需要为 NOT NULL 的透视字段中使用 NVL 函数,但它们仍然变为 NULLABLE。
这对我来说是个问题,因为我使用的是 MS Entity Framework,它不会根据没有 NOT NULLABLE 列的表或视图更新模型。
当基于 PIVOT 查询创建视图时,所有视图字段在视图元数据中都变为 NULLABLE,有没有办法使它们不为空?
我在需要为 NOT NULL 的透视字段中使用 NVL 函数,但它们仍然变为 NULLABLE。
这对我来说是个问题,因为我使用的是 MS Entity Framework,它不会根据没有 NOT NULLABLE 列的表或视图更新模型。
@Miguel,我不知道“MS Entity Framework”,但这个名字听起来像是一个面向编辑数据的框架。“实体”通常用于构建数据库数据的缓存,以准备将数据更改和更新回数据库。这似乎不是您想要做的。
重新阅读这个问题,我相信您有某种枢轴生成器正在使用来为用户即时创建视图。因此,您不打算修改实体模型。我认为您根本不需要实体模型。
实体框架可能会寻找 NOT NULL 列,以便找到它可以使用的“主键”或其他行级标识符。为什么要这些?
我还推测您有某种 UI 控件可以很好地呈现“实体”集合,因此您想使用该控件。
控件可能不需要“实体” - 检查它的接口是什么。也许有一个实体的超类或一个您可以生成的接口,而不是一个可更新的实体。如果你能做到这一点,你应该能够在漂亮的 UI 控件中呈现它,而不是用你的 NULLABLE 列撞墙。
您需要在 Visual Studio (VS) 中更新您的模型。因为这不知道每一列中的类型信息是什么。然后你必须在数据透视表的查询中指定数据类型。例如,使用 to_number 指定显式转换。当您要在 VS 中更新模型时,您必须基于例如物化视图(具有明确定义的数据类型)。请使用基于数据透视表的明确定义的数据类型创建物化视图(这不仅必须包含 nvl 函数,还必须包含定义的数据类型、字符串、数字等),然后更新您的模型。只有物化视图?不,它可以是一张桌子(但很麻烦)。可以直接来自数据透视表吗?并不总是有效(如您的情况)。重要的是有定义的数据类型。
一种可能的解决方案是根据查询结果动态生成一个新表,并在此之后对该表进行调整约束。对于太多动态 SQL,我不喜欢这种方法 :)
另一种解决方案是预先构建的物化视图。在此处(Oracle 文档)查看“ON PREBUILT TABLE Clause”。
如果您不需要很多这些视图,您可以使用代码优先,Scott Gu 有一篇很好的文章“Code first with existing database”展示了如何做到这一点。
这可能需要有 2 种方法来访问数据库,这可能对您有用,也可能不适合您。