Tel*_*ast 5 c# oracle entity-framework odac
我正在尝试使用ODAC 12c Release 4和带有EF 6的Visual Studio 2015将表和视图从Oracle数据库导入到.edmx模型中.
我可以很好地导入大多数表和视图,但其中一些包含错误,我无法弄清楚如何解决这些问题.具体来说,我遇到两种类型的错误:
以前我使用过ODAC 11和EF 5,我可以通过以下方式解决这些错误:
尝试使用新软件导入具有这些问题的表和视图更成问题.而不是先导入并指出之后的错误,我根本不允许导入.这是我遇到两个问题的地方:
尝试添加具有此问题的表将失败,无需解释.没有任何内容可以添加到图表,模型和model.store中.一次添加一个表允许我添加有问题的外键连接的任何一端但是尝试添加另一个表只会给出此错误然后什么都不做:
"模型是在出现警告或错误的情况下生成的.Model.edmx.有关详细信息,请参阅错误列表.在运行应用程序之前,必须先修复这些问题."
但错误列表将为空.我甚至无法看到哪个表导致问题,以帮助我解决数据库中的问题.
在将行号添加为主键之前,视图将添加到model.store中,但注释掉了此错误:
"错误6013:表/视图'[ViewName]'没有定义主键,也没有推断出有效的主键.此表/视图已被排除.要使用该实体,您需要检查您的模式,添加正确的密钥,并取消注释."
添加行号作为主键后,我得到此错误:
"错误13101:类型'[ViewName]'的关键部分'ID'无效.密钥的所有部分必须是不可为空的."
根本不会导入视图,因为Oracle不允许在视图上使用Nullable = False,因此无法解决问题.因此我无法在导入之前修复它,但我无法在不先修复它的情况下导入它...
我如何使用ODAC 12c Release 4和EF 6处理这些问题?
每次我想从数据库导入表和视图时,必须使用EF 5返回ODAC 11和Visual Studio 2012会变得很烦人.
搜索具有相同问题的其他人只会给出一些点击而没有答案.
编辑:我找到了解决视图问题的方法.
我创建了一个Row_Number表,Row_Number作为唯一列,并加入了视图.由于表中的Row_Number是主键,因此在结果视图中将其标记为Nullable = False,并且可以导入.
一些代码可以帮助其他人解决同样的问题:
CREATE TABLE "ROW_NUMBER"
( "ROW_NUMBER" NUMBER(9,0) NOT NULL ENABLE,
CONSTRAINT "ROW_NUMBER_PK" PRIMARY KEY ("ROW_NUMBER"));
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
begin
CREATE_ROW_NUMBER;
end;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
小智 2
很好的解决方案。工作完美。在这里我想分享3点补充。
\n\n询问:
\n\nCREATE OR REPLACE FORCE VIEW New_View (\xe2\x80\x9cID\xe2\x80\x9d, [COLUMNS]) AS \n SELECT Row_Number.Row_Number, [COLUMNS]\n FROM Row_Number INNER JOIN (\n SELECT ROWNUM Row_Number, [COLUMNS]\n FROM (SELECT [COLUMNS] FROM Original_View)\n ) Original_View_1 \n ON Row_Number.Row_Number = Original_View_1.Row_Number; \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1378 次 |
| 最近记录: |