环境
使用Entity Framework在MVC应用程序控制器中执行LINQ语句时出现ORA-01031
错误。
LINQ语句正在针对Oracle视图执行,其用户不是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;
使用视图非常重要,因为GIS系统中的每个B$
表都有ADD
,DELETE
,EDIT
等交易记录。
这是交易表示由供应商内置。每个视图都会删除这些交易记录。
你能告诉我我缺少哪些Oracle权限吗?
而且,我可以在实体框架中使用Oracle视图吗?
如果没有,我想我必须构建自定义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交谈并询问他的意见。
谢谢。
答案 0 :(得分:3)
这已经解决了。因为我正在使用现有的Oracle数据库,所以我不得不禁用数据库初始化程序。
public VisualInspectionDbContext()
: base("name=GisStageDbContext")
{
Database.SetInitializer<VisualInspectionDbContext>(null);
}
基本上DART用户是低权限用户,没有任何创建数据库表的权限。每次DBContext对象初始化时 - 实体框架都试图在没有权限的用户下创建Oracle表。无论如何,如果您使用现有数据库 - 禁用初始化程序,否则;将根据C#类定义重新创建每个表。 我希望这篇文章能够帮助其他人。
此致
Serghei