ORA-01031:使用实体框架

时间:2015-08-10 17:24:53

标签: oracle entity-framework

环境

  1. Oracle 11g
  2. EntityFramework 6.1.1
  3. Oracle.ManagedDataAccess v 12.1.022
  4. Oracle.ManagedDataAccess.EntityFramework v 12.1.022
  5. 使用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;
    
    1. 当我使用用户DART使用Toad软件登录时,我可以对表和视图执行select语句。
    2. 当我在Visual Studio中的Server Explorer上使用相同的用户时 - 表和视图节点为空。
    3. 我可以使用LINQ查询Oracle表,但不能查询Oracle View。
    4. 使用视图非常重要,因为GIS系统中的每个B$表都有ADDDELETEEDIT等交易记录。

      这是交易表示由供应商内置。每个视图都会删除这些交易记录。

    5. 你能告诉我我缺少哪些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交谈并询问他的意见。

      谢谢。

1 个答案:

答案 0 :(得分:3)

这已经解决了。因为我正在使用现有的Oracle数据库,所以我不得不禁用数据库初始化程序。

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

    Database.SetInitializer<VisualInspectionDbContext>(null);

}

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

此致

Serghei

相关问题