gpt4 book ai didi

c# - 使用 ODAC 12c 第 4 版和 EF 6 将 Oracle 数据库导入 Entity Framework 模型时如何解决问题?

转载 作者:太空狗 更新时间:2023-10-29 23:37:49 24 4
gpt4 key购买 nike

我正在尝试使用 ODAC 12c 第 4 版和带有 EF 6 的 Visual Studio 2015 将表和 View 从 Oracle 数据库导入到 .edmx 模型中。


我可以很好地导入大多数表和 View ,但其中一些包含错误,我无法弄清楚如何解决这些问题。具体来说,我遇到了两种类型的错误:

  1. 数据类型错误的外键。通常是连接到 NUMBER(9,0) 列的 NUMBER 外键列。这些将被转换为 decimal 和 int32,从而导致错误。
  2. 没有主键的 View 。


以前我将 ODAC 11 与 EF 5 一起使用,我可以通过以下方式解决这些错误:

  1. 导入会将有问题的表添加到图表中并指出错误。要修复它,我所要做的就是更改模型中的数据类型。
  2. 为了获得主键,我添加了 ROW_NUMBER() AS ID 作为列并将其设置为具有禁用约束 CONSTRAINT ID_PK PRIMARY KEY (ID) DISABLE 的主键。这将让我导入 View ,但我仍然会收到有关主键可为空的错误,因此我创建了一个脚本,该脚本将为所有主键添加 Nullable=False。在此之后一切都会正常工作。


尝试使用新软件导入有这些问题的表和 View 问题要大得多。而不是先导入然后指出错误,我根本不允许导入。这是我遇到两个问题的地方:

  1. 尝试添加具有此问题的表将失败,且无解释。图表、模型和 model.store 都不会添加任何内容。一次添加一个表可以让我添加有问题的外键连接的任一端,但尝试添加另一个表只会出现此错误,然后什么都不做:

    “生成的模型带有警告或错误。 Model.edmx。有关详细信息,请参阅错误列表。在运行应用程序之前必须解决这些问题。”

    但错误列表将为空。我什至看不到导致问题的表来帮助我解决数据库中的问题。

  2. 在添加行号作为主键之前, View 将被添加到 model.store 但被注释掉并出现以下错误:

    “错误 6013:表/ View ‘[ViewName]’没有定义主键,无法推断出有效的主键。该表/ View 已被排除。要使用该实体,您需要检查您的模式,添加正确的键,然后取消注释。”

    添加行号作为主键后,我得到了这个错误:

    “错误 13101:类型‘[ViewName]’的键部分‘ID’无效。键的所有部分都必须不可为空。”

    View 根本不会被导入,我无法解决这个问题,因为 Oracle 不允许在 View 上使用 Nullable=False。所以我无法在导入之前修复它,但如果不先修复它我就无法导入它...


我应该如何使用 ODAC 12c 第 4 版和 EF 6 来处理这些问题?

每次我想从数据库中导入表和 View 时都必须返回到 ODAC 11 和带有 EF 5 的 Visual Studio 2012,这很烦人。

搜索其他有相同问题的人只会得到一些结果,没有答案。


编辑:我找到了解决 View 问题的方法。

我创建了一个以 Row_Number 作为唯一列的 Row_Number 表,并用它连接了 View 。由于表中的 Row_Number 是主键,因此在结果 View 中它将被标记为 Nullable=False 并且可以导入。

一些代码可以帮助其他人解决同样的问题:

CREATE TABLE "ROW_NUMBER" 
( "ROW_NUMBER" NUMBER(9,0) NOT NULL ENABLE,
CONSTRAINT "ROW_NUMBER_PK" PRIMARY KEY ("ROW_NUMBER"));

CREATE OR REPLACE PROCEDURE CREATE_ROW_NUMBER IS
LOOP_ROW_NUMBER NUMBER := 1;
BEGIN
LOOP
INSERT INTO ROW_NUMBER(ROW_NUMBER)
VALUES (LOOP_ROW_NUMBER);
LOOP_ROW_NUMBER := LOOP_ROW_NUMBER + 1;
IF LOOP_ROW_NUMBER > 1000000 THEN
EXIT;
END IF;
END LOOP;
COMMIT;
END CREATE_ROW_NUMBER;

begin
CREATE_ROW_NUMBER;
end;

CREATE OR REPLACE FORCE VIEW New_View (“ID”, [COLUMNS]) AS 
SELECT Row_Number.Row_Number, [COLUMNS]
FROM Row_Number INNER JOIN (
SELECT ROWNUM Row_Number, [COLUMNS]
FROM(
SELECT * FROM Table1
UNION
SELECT * FROM Table2
) Original_View ON Row_Number.Row_Number = Original_View.Row_Number;

最佳答案

不错的解决方案。工作完美。这里我想分享3个补充。

  1. 缺少一个“)”
  2. 您可以使用现有 View 作为原始 View
  3. 在别名 View 名称中添加“_1”

查询:

CREATE OR REPLACE FORCE VIEW New_View (“ID”, [COLUMNS]) AS 
SELECT Row_Number.Row_Number, [COLUMNS]
FROM Row_Number INNER JOIN (
SELECT ROWNUM Row_Number, [COLUMNS]
FROM (SELECT [COLUMNS] FROM Original_View)
) Original_View_1
ON Row_Number.Row_Number = Original_View_1.Row_Number;

关于c# - 使用 ODAC 12c 第 4 版和 EF 6 将 Oracle 数据库导入 Entity Framework 模型时如何解决问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33101266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com