环境
-
Oracle 11g
-
EntityFramework 6.1.1
-
Oracle.ManagedDataAccess v 12.1.022
-
Oracle.ManagedDataAccess.EntityFramework v 12.1.022
在使用Entity Framework在MVC应用程序控制器中执行LINQ语句时,我收到 ORA-01031
错误 .
正在针对Oracle视图执行LINQ语句,其用户不是Oracle模式所有者 . 所有拨款都是通过Oracle角色设置的 .
这是Oracle的定义
--ROLE
DROP ROLE DART_PORTAL;
CREATE ROLE DART_PORTAL NOT IDENTIFIED;
-- Object privileges granted to DART_PORTAL
GRANT SELECT ON GISPROD.B$FIM_D_POLE_VISINSP_N TO DART_PORTAL; --table
GRANT SELECT ON GISPROD.FIM_D_POLE_VISINSP_N TO DART_PORTAL; --view
GRANT EXECUTE ON GISPROD.LTT_USER TO DART_PORTAL; --package is being utilized in VIEW
-- Grantees of DART_PORTAL
GRANT DART_PORTAL TO DART WITH ADMIN OPTION; --user
GRANT DART_PORTAL TO GISPROD WITH ADMIN OPTION; --schema owner
--USER
DROP USER DART CASCADE;
CREATE USER DART
IDENTIFIED BY <password>
DEFAULT TABLESPACE GISDEV
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 3 Roles for DART
GRANT DART_INTERFACE TO DART WITH ADMIN OPTION; --another role
GRANT DART_PORTAL TO DART WITH ADMIN OPTION; --role from the role script
GRANT RESOURCE TO DART;
ALTER USER DART DEFAULT ROLE ALL;
-- 5 System Privileges for DART
GRANT ALTER SESSION TO DART;
GRANT CREATE SESSION TO DART;
GRANT EXECUTE ANY PROCEDURE TO DART;
GRANT SELECT ANY SEQUENCE TO DART;
GRANT UNLIMITED TABLESPACE TO DART;
-
当我使用用户DART使用Toad软件登录时,我可以对表和视图执行select语句 .
-
当我在Visual Studio中的Server Explorer上使用相同的用户时 - 表和视图节点为空 .
-
我可以使用LINQ查询Oracle表,但不能查询Oracle View .
-
使用视图很重要,因为我们GIS系统中的每个
B$
表都有事务记录,如ADD
,DELETE
,EDIT
.
这是交易表示由供应商内置 . 每个视图都消除了这些事务记录 .
你能告诉我我缺少哪些Oracle权限吗?
而且,我可以将Oracle视图与Entity Framework一起使用吗?
如果没有,我想我必须构建自定义LINQ扩展方法,以便在直接从Oracle表中选择记录时消除这些事务记录 .
web.config
中定义的连接字符串:
<add name="GisStageDbContext" connectionString="DATA SOURCE=SERVERNAME:PORT/SERVICENAME;USER ID=DART;PASSWORD=PASSWORD" providerName="Oracle.ManagedDataAccess.Client" />
我创建了简单的控制器操作并将用户返回到MVC视图
此代码有效:
public ActionResult Test()
{
var test = _testContext.Database.SqlQuery<string>("select user from dual").First();
ViewBag.User = test;
return View();
}
查询Oracle视图但不查询Oracle表时,我仍然遇到同样的错误
此代码与表名一起按预期工作
[Table(name:"B$FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{
[Key]
[Column(name: "G3E_ID", Order = 0)]
[Display(Name = "G3E ID")]
public long Id { get; set; }
[Column(name: "FIM_STATE")]
[Display(Name = "Fim State")]
[StringLength(maximumLength: 15)]
public string FimState { get; set; }
[Column(name: "INSPECTION_STATUS")]
[Display(Name = "inspection Status")]
[StringLength(maximumLength: 15)]
public string InspectionStatus { get; set; }
}
此代码不起作用,并给我错误
[Table(name:"FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{
//Same fields
}
数据库上下文类是
public class VisualInspectionDbContext : DbContext
{
public VisualInspectionDbContext()
: base("name=GisStageDbContext"){}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("GISPROD");
}
public DbSet<AssetPole> AssetPoles { get; set; }
public DbSet<FimPole> FimPoles { get; set; }
}
我必须和我们的Oracle DBA交谈并询问他的意见 .
谢谢 .
1 回答
这已经解决了 . 因为我正在使用现有的Oracle数据库,所以我不得不禁用数据库初始化程序 .
基本上DART用户是低权限用户,并且没有任何创建数据库表的权限 . 每次DBContext对象初始化时 - 实体框架都试图在没有权限的用户下创建Oracle表 . 无论如何,如果您使用现有数据库 - 禁用初始化程序,否则;将根据C#类定义重新创建每个表 . 我希望这篇文章能够帮助其他人 .
问候,
Serghei