ORA-01031:使用实体框架的Oracle视图权限不足

ORA-01031:使用实体框架的Oracle视图权限不足,oracle,entity-framework,Oracle,Entity Framework,环境 甲骨文11g 实体框架6.1.1 Oracle.ManagedDataAccess v 12.1.022 Oracle.ManagedDataAccess.EntityFramework v 12.1.022 我在使用实体框架的MVC应用程序控制器中执行LINQ语句时遇到ORA-01031错误 正在对Oracle视图执行LINQ语句,用户不是Oracle架构所有者。所有授权都是通过Oracle角色设置的 这是Oracle的定义 --ROLE DROP ROLE DART_PORTAL;

环境

甲骨文11g 实体框架6.1.1 Oracle.ManagedDataAccess v 12.1.022 Oracle.ManagedDataAccess.EntityFramework v 12.1.022 我在使用实体框架的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;
我创建了简单的控制器操作并将用户返回到MVC视图

此代码适用于:

public ActionResult Test()
{

var test = _testContext.Database.SqlQuery<string>("select user from dual").First();

ViewBag.User = test;

return View();

}
此代码不工作,请告诉我错误

[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谈谈,征求他的意见


谢谢。

这个问题已经解决了。因为我正在使用现有的Oracle数据库,所以必须禁用数据库初始值设定项

        public VisualInspectionDbContext()
    : base("name=GisStageDbContext")
{

    Database.SetInitializer<VisualInspectionDbContext>(null);

}
DART用户基本上是低权限用户,没有创建数据库表的任何权限。每次DBContext对象初始化时,Entity Framework都试图在没有权限的用户下创建Oracle表。无论如何,如果您使用现有的数据库-禁用初始值设定项,否则;每个表都将根据C类定义重新创建。 我希望这篇文章能帮助其他人

问候,


Serghei

LINQ和EF与您的错误无关。显然,EF没有使用DART用户连接到数据库。你检查过你的连接字符串了吗?我刚才提到LINQ是因为我在MVC项目中使用它。连接字符串100%正确。如果我将视图更改为table name,则查询可以工作。[TableName]MyClass{}工作正常。[TableViewName]MyClass{}不起作用。在web.configLet中定义的相同连接字符串让我们对其进行测试。你能运行这个,告诉我们什么字符串回来了吗?context.Database.SqlQueryselect user from dual.First;如果我在连接字符串中使用模式所有者并以这种方式装饰C类-[TableViewName]MyClass{},我会遇到另一个错误:对象名已经在使用中。我有工作中的所有细节,明天可以提供。我真的很感谢你的帮助。明天我将运行测试。如果明天您有更多详细信息,请确保通过编辑将其添加到您的帖子中。这样做总比不断添加评论要好。更多的人将以这种方式看到新信息。
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; }
}
        public VisualInspectionDbContext()
    : base("name=GisStageDbContext")
{

    Database.SetInitializer<VisualInspectionDbContext>(null);

}