3

我正在使用EF 6.0.0.0和ODP.Net Oracle.ManagedDataAccess版本4.121.2.0創建一個MVC應用程序用於數據訪問。表使用EF 6和Oracle.ManagedDataAccess時不存在

在我Controller稱爲EmployeeController,我有下面的代碼片段:

public ActionResult Details(int id) { 
    try { 
     EmployeeContext employeeContext = new EmployeeContext(); 
     Employee employee = employeeContext.Employees.Single(x => x.Id == id); //Here the exception occurs! 
     return View(employee); 
    } catch (Exception e) { 
     return View(e); 
    } 
} 

當我加載Employee/Details.cshtml頁面我得到了以下異常:

「在執行時發生錯誤有關詳細信息,請參閱 內部異常。「

而在內部異常,它說:

ORA-00942:表或視圖不存在

這讓我爲難,因爲我在Oracle數據庫中,表確實存在(我查用蟾蜍爲Oracle):

enter image description here

數據庫本身的connectionString與我用於其他項目的相同連接字符串以及我能夠毫無困難地從數據庫查詢數據的位置。

這裏是我Employee類是如何在Models/Employee.cs聲明:

using System.ComponentModel.DataAnnotations.Schema; 
. 
. 
. 
[Table("TBLEMPLOYEE")] //the same table name 
public class Employee { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public DateTime DateOfBirth { get; set; } 
    public int EmployeeType { get; set; } 
    public double? AnnualSalary { get; set; } 
    public double? HourlyPay { get; set; } 
    public double? HoursWorked { get; set; } 
    public string City { get; set; } 
} 

而且我Models/EmployeeContext.cs僅僅是由一個單一的元素:

using System.Data.Entity; 
. 
. 
. 
public class EmployeeContext : DbContext { 
    public DbSet<Employee> Employees { get; set; } 
} 

而在Global.asax.cs文件,我已經初始化EmployeeContext型號的數據庫:

protected void Application_Start() { //executed at the very beginning    
    Database.SetInitializer<MvcWebApplication1.Models.EmployeeContext>(null); //null -> no initialization strategy 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

如果表格不存在,我還會得到什麼錯誤?這裏可能會出現什麼問題?任何建議如何調試這種情況?

編輯:

當我評價employeeContext.Employees,我得到了以下值:

{SELECT 
"Extent1"."Id" AS "Id", 
"Extent1"."Name" AS "Name", 
"Extent1"."Gender" AS "Gender", 
"Extent1"."DateOfBirth" AS "DateOfBirth", 
"Extent1"."EmployeeType" AS "EmployeeType", 
"Extent1"."AnnualSalary" AS "AnnualSalary", 
"Extent1"."HourlyPay" AS "HourlyPay", 
"Extent1"."HoursWorked" AS "HoursWorked", 
"Extent1"."City" AS "City" 
FROM "dbo"."TBLEMPLOYEE" "Extent1"} 

編輯2:

使用:

employeeContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

我在我的調試輸出窗口如下:

SELECT 
"Extent1"."Id" AS "Id", 
"Extent1"."Name" AS "Name", 
"Extent1"."Gender" AS "Gender", 
"Extent1"."DateOfBirth" AS "DateOfBirth", 
"Extent1"."EmployeeType" AS "EmployeeType", 
"Extent1"."AnnualSalary" AS "AnnualSalary", 
"Extent1"."HourlyPay" AS "HourlyPay", 
"Extent1"."HoursWorked" AS "HoursWorked", 
"Extent1"."City" AS "City" 
FROM "dbo"."TBLEMPLOYEE" "Extent1" 
WHERE ("Extent1"."Id" = :p__linq__0) AND (ROWNUM <= (2)) 

編輯3:

這是我的連接字符串看起來像,以防萬一它是需要

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-MvcWebApplication1-20160212010850.mdf;Initial Catalog=aspnet-MvcWebApplication1-20160212010850;Integrated Security=True" 
     providerName="System.Data.SqlClient" /> 
    <add name="EmployeeContext" connectionString="Data source=thisisfakedatasource;user id=thisisfakename;password=thisisfakepassword;persist security info=True" 
     providerName="Oracle.ManagedDataAccess.Client"/> 
    </connectionStrings> 

而且entityFramework的設置如下:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </providers> 
    </entityFramework> 

任何線索的問題可能是?

附加信息:

異常堆棧跟蹤:

e.StackTrace 

    at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
    at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6() 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5() 
    at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() 
    at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
    at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable`1 sequence) 
    at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) 
    at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression) 
    at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression) 
    at System.Linq.Queryable.Single[TSource](IQueryable`1 source, Expression`1 predicate) 
    at MvcWebApplication1.Controllers.EmployeeController.Details(Int32 id) in c:\myapp\Controllers\EmployeeController.cs:line 25 

內部異常堆棧跟蹤:

(e.InnerException).StackTrace 

    at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone) 
    at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, OracleException& exceptionForArrayBindDML, Boolean isDescribeOnly, Boolean isFromEF) 
    at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c) 
    at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) 
    at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
+0

您是否試圖查看EF生成的SQL查詢?例如'employeeContext.Database.Log = s => {};'並在lambda體內放置一個斷點。 –

+0

@IvanStoev不,但我會試一試,如果這可以幫助我找到問題...給我一分鐘 – Ian

+0

@IvanStoev好的,我剛剛發佈了由EF生成的SQl查詢,使用您建議的方法。 – Ian

回答

3

爲什麼Data Table的意見沒有被發現,如建議通過DevilSuichiro問題,是由於使用了錯誤的Schema。默認情況下,EF 6使用dbo作爲默認模式,而我的模式不是dbo。爲了使具有模型默認模式,需要對OnModelCreating事件壓倒一切的:

public class EmployeeContext : DbContext { 
    public DbSet<Employee> Employees { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.HasDefaultSchema("myschema"); 
    } 
} 

此外,由於Ivan Stoev他的建議,以檢查由EF生成的SQL。