Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于透视查询的Oracle视图非空值_C#_Sql_Database_Oracle_Entity Framework - Fatal编程技术网

C# 基于透视查询的Oracle视图非空值

C# 基于透视查询的Oracle视图非空值,c#,sql,database,oracle,entity-framework,C#,Sql,Database,Oracle,Entity Framework,基于透视查询创建视图时,视图元数据中的所有视图字段都将变为可空,是否有任何方法使其不可空 我在数据透视字段中使用NVL函数,我需要不为NULL,但它们仍然可以为NULL 这对我来说是个问题,因为我使用的是MS Entity Framework,如果没有不可为空的列,它将不会基于表或视图更新模型。一个可能的解决方案是根据查询结果动态生成一个新表,并在此基础上调整此表的约束。 对于太多的动态SQL,我不喜欢这种方法:) 另一个解决方案是预构建物化视图。 在此处查找“ON prebuilded TAB

基于透视查询创建视图时,视图元数据中的所有视图字段都将变为可空,是否有任何方法使其不可空

我在数据透视字段中使用NVL函数,我需要不为NULL,但它们仍然可以为NULL


这对我来说是个问题,因为我使用的是MS Entity Framework,如果没有不可为空的列,它将不会基于表或视图更新模型。

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

另一个解决方案是预构建物化视图。
在此处查找“ON prebuilded TABLE子句”。

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

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

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

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

  • 提供可用于更新任何行的键
  • 提供用于对结果集进行分页的键
  • 提供一个键以支持结果集的内存过滤
  • 支持对结果集执行动态排序操作
我还推测您有某种UI控件,可以很好地显示“实体”集合,因此您希望使用该控件


控件可能不需要“实体”-检查其接口是什么。也许您可以生成实体的超类或接口,而不是可更新的实体。如果你能做到这一点,你应该能够在spiffy UI控件中展示它,而不会让你的可空列撞到墙上。

你可以先使用代码如果你不需要很多这样的视图,Scott Gu有一篇很好的文章展示了如何做到这一点


这可能需要有两种方法来访问数据库,这可能对您有用,也可能对您无效。

我认为它不适用于解决我的问题。因为即使我在被查询的表中创建一个新的虚拟列,PIVOT函数也会将该字段变为null。我遗漏了什么吗?作为一个PIVOT查询可能与视图元数据的核心问题无关。@MiguelMatos您使用的是什么版本的VS?我认为在您提出的两个建议中,我都无法访问实时数据,只能访问基于查询数据创建的快照。我错过什么了吗?谢谢。是否要将可编辑记录集作为PIVOT查询的结果?我没想到:)通常PIVOT用于折叠数据。因此,结果将不允许编辑。米格尔,这篇文章()中的答案能帮助你吗?物化视图不是一个选项,因为它不是基于实时数据,它必须更新。使用视图时,即使在字段中使用NVL,它在视图元数据中仍然可以为空。由于所有字段都可为空,因此在VS中更新模型时,不会添加视图,因为EF需要具有唯一的不可为空字段才能将表添加到模型中。您可以将实体框架视为将数据库对象映射到应用程序域中的类的层,允许开发人员使用强类型对象与数据库交互。我们的应用程序的结构是,所有的数据库访问都是使用实体框架进行的,这是我们的数据访问层。对,但您对实体框架的描述向我清楚地表明,它强烈地面向更新数据。这与您声明的意图不匹配,也与视图的语义不匹配。难道没有一个不可更新的类或接口可以用来代替实体吗?+1 Andrew在这里提出了一些很好的观点。我还想补充一点,我见过根据需要同时使用ORM框架和直接查询的实现。正如Andrew所说,使用ORM框架的主要原因之一是要有持久对象。在这种情况下,我不想更新数据,但我希望能够以我们在所有应用程序中使用的相同方式检索数据,这样我们就可以拥有一个强类型对象,而不必为我们使用的每个视图手动创建一个对象,并且只维护一个数据库访问层。