简体   繁体   English

Entity Framework SQLQuery Oracle 指定的方法不受支持

[英]Entity Framework SQLQuery Oracle specified method is not supported

I'm trying to retrieve list of DbResult from an oracle database table, with the code below by Execute Raw SQL Queries in Entity Framework 6.我正在尝试从 oracle 数据库表中检索DbResult列表,下面的代码通过在实体框架 6 中执行原始 SQL 查询。

var query = repository.DbContext.Database.SqlQuery<DbResult>("SELECT NAME as Name,SUB_PORTFOLIO_INSTANCE_ID as SubPortfolioInstanceID,STATUS as Status FROM DGARSMART.T_SC_SERVICE");
List<DbResult> serviceList = query.ToList();

This query throws an exception:此查询引发异常:

Specified method is not supported.不支持指定的方法。

I think It's because of query trying to parse STATUS column(type of number(1,0) in Oracle) to bool Status property belongs to DbResult .我认为这是因为查询试图将STATUS列(Oracle 中的 number(1,0) 类型)解析为 bool Status 属性属于DbResult How can I achieve parse that query to my DbResult class?如何将该查询解析为我的DbResult类?

By the way if I remove STATUS statement from query it retrives data and parse to DbResult object successfully.顺便说一下,如果我从查询中删除STATUS语句,它会检索数据并成功解析为DbResult对象。

class DbResult
{
   public string Name { get; set; }
   
   public DateTime SubPortfolioInstanceID { get; set; }

   public bool Status { get; set; }

 }

Stack Trace:堆栈跟踪:

   at Oracle.ManagedDataAccess.Client.OracleDataReader.GetBoolean(Int32 i)
   at System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.ReadBool(DbDataReader reader, Int32 ordinal)
   at System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.Initialize(DbDataReader reader, DbSpatialDataReader spatialDataReader, Type[] columnTypes, Boolean[] nullableColumns)
   at System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.Initialize(String providerManifestToken, DbProviderServices providerServices, DbDataReader reader, Type[] columnTypes, Boolean[] nullableColumns)
   at System.Data.Entity.Core.Objects.Internal.BufferedDataReader.Initialize(String providerManifestToken, DbProviderServices providerServices, Type[] columnTypes, Boolean[] nullableColumns)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass24`1.<ExecuteStoreQueryReliably>b__23()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass24`1.<ExecuteStoreQueryReliably>b__22()
   at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClasse`1.<ExecuteSqlQuery>b__d()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()

I'm using these packages:我正在使用这些软件包:

<package id="EntityFramework" version="6.0.0" targetFramework="net45" />
<package id="Oracle.ManagedDataAccess" version="12.2.1100" targetFramework="net45" />
<package id="Oracle.ManagedDataAccess.EntityFramework" version="12.2.20190115" targetFramework="net45" />
 

The quick-and-dirty solution is to use a hidden Int32 property and expose it as a Boolean value.快速而肮脏的解决方案是使用隐藏的Int32属性并将其公开为Boolean值。

See mapping private property entity framework code first and Entity Framework Many to many through containing object先看映射私有属性实体框架代码实体框架多对多通过包含对象

class DbResult
{
   public string Name { get; set; }

   public DateTime SubPortfolioInstanceID { get; set; }

   [Column("Status")]
   private Int32 HiddenStatus { get; set; }

   public Boolean Status => this.HiddenStatus != 0;

 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM