Ser*_*i T 3 oracle entity-framework
环境
ORA-01031使用实体框架在 MVC 应用程序控制器中执行 LINQ 语句时出现错误。
正在使用不是 Oracle 架构所有者的用户对 Oracle 视图执行 LINQ 语句。所有授权都是通过 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;
Run Code Online (Sandbox Code Playgroud)
当我使用用户 DART 使用 Toad 软件登录时,我可以对表和视图执行选择语句。
当我在 Visual Studio 的服务器资源管理器上使用相同的用户时 - 表和视图节点为空。
我可以使用 LINQ 查询 Oracle 表,但不能使用 Oracle 视图。
使用视图很重要,因为B$我们 GIS 系统中的每个表都有事务记录,例如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" />
Run Code Online (Sandbox Code Playgroud)
我创建了简单的控制器操作并将用户返回到 MVC 视图
此代码有效:
public ActionResult Test()
{
var test = _testContext.Database.SqlQuery<string>("select user from dual").First();
ViewBag.User = test;
return View();
}
Run Code Online (Sandbox Code Playgroud)
查询 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; }
}
Run Code Online (Sandbox Code Playgroud)
此代码不起作用并给我错误
[Table(name:"FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{
//Same fields
}
Run Code Online (Sandbox Code Playgroud)
数据库上下文类是
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; }
}
Run Code Online (Sandbox Code Playgroud)
我必须与我们的 Oracle DBA 交谈并询问他的意见。
谢谢你。
这已得到解决。因为我正在使用现有的 Oracle 数据库,所以我不得不禁用数据库初始值设定项。
public VisualInspectionDbContext()
: base("name=GisStageDbContext")
{
Database.SetInitializer<VisualInspectionDbContext>(null);
}
Run Code Online (Sandbox Code Playgroud)
基本上 DART 用户是低权限用户,没有任何创建数据库表的权限。每次 DBContext 对象初始化时 - 实体框架试图在没有权限的用户下创建 Oracle 表。无论如何,如果您使用现有数据库 - 禁用初始化程序,否则;每个表都将根据 C# 类定义重新创建。我希望这篇文章能帮助其他人。
问候,
谢尔盖
| 归档时间: |
|
| 查看次数: |
4205 次 |
| 最近记录: |