2017-03-03 1 views
0

現在、私はメンテナンスのために契約しているアプリケーションのバックエンドでいくつかのコードのクリーンアップに取り組んでいます。私は、Oracle Data Reader経由でDBへのコールが行われているメソッドを実行しました。 SQLを調べた後、Oracle Data Readerを開くよう呼び出す必要はなく、オブジェクトがロードされる方法がEntity Frameworkのコンテキスト内にあることがわかりました。代わりにEntity Modelの使用に従うようにコードを変更しました。以下は私が行った変更です。SQLクエリのエラー

オリジナルコード

var POCs = new List<TBLPOC>(); 

Context.Database.Connection.Open(); 
var cmd = (OracleCommand)Context.Database.Connection.CreateCommand(); 
OracleDataReader reader; 
var SQL = string.Empty; 
if (IsAssociate == 0) 
    SQL = @"SELECT tblPOC.cntPOC,INITCAP(strLastName),INITCAP(strFirstName) 
      FROM tblPOC,tblParcelToPOC 
      WHERE tblParcelToPOC.cntPOC = tblPOC.cntPOC AND 
       tblParcelToPOC.cntAsOf = 0 AND 
       tblParcelToPOC.cntParcel = " + cntParcel + " ORDER BY INITCAP(strLastName)"; 
else 
    SQL = @"SELECT cntPOC,INITCAP(strLastName),INITCAP(strFirstName) 
      FROM tblPOC 
      WHERE tblPOC.cntPOC NOT IN (SELECT cntPOC 
             FROM tblParcelToPOC 
             WHERE cntParcel = " + cntParcel + @" 
              AND cntAsOf = 0) 
       AND tblPOC.ysnActive = 1 ORDER BY INITCAP(strLastName)"; 
cmd.CommandText = SQL; 
cmd.CommandType = CommandType.Text; 
using (reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     POCs.Add(new TBLPOC { CNTPOC = (decimal)reader[0], 
           STRLASTNAME = reader[1].ToString(), 
           STRFIRSTNAME = reader[2].ToString() }); 
    } 
} 
Context.Database.Connection.Close(); 
return POCs; 

置換コードが実行されたときに、私が今抱えている問題がある交換コード

var sql = string.Empty; 
if (IsAssociate == 0) 
    sql = string.Format(@"SELECT tblPOC.cntPOC,INITCAP(strLastName),INITCAP(strFirstName) 
          FROM tblPOC,tblParcelToPOC 
          WHERE tblParcelToPOC.cntPOC = tblPOC.cntPOC 
           AND tblParcelToPOC.cntAsOf = 0 
           AND tblParcelToPOC.cntParcel = {0} 
          ORDER BY INITCAP(strLastName)", 
          cntParcel); 
else 
    sql = string.Format(@"SELECT cntPOC,INITCAP(strLastName), INITCAP(strFirstName) 
          FROM tblPOC 
          WHERE tblPOC.cntPOC NOT IN (SELECT cntPOC 
                 FROM tblParcelToPOC 
                 WHERE cntParcel = {0} 
                 AND cntAsOf = 0) 
           AND tblPOC.ysnActive = 1 
          ORDER BY INITCAP(strLastName)", 
          cntParcel); 

return Context.Database.SqlQuery<TBLPOC>(sql, "0").ToList<TBLPOC>(); 

、私は次のエラーを取得する:

データリーダーが指定された 'TBLPOC'と互換性がありません。 'CNTPOCORGANIZATION'タイプのメンバーには、同じ名前のデータリーダーに対応する列がありません。

フィールドcntPOCOrganizationは、tblPOC内およびTBLPOCエンティティ内に存在します。 cntPOCOrganizationはヌル値の10進数です(10進数の理由を聞かないでください。私は以前の請負業者が識別子に対して小数点以下を使用していた理由を知りません...)。しかし、過去のコードや新しいコードでは、そのフィールドを埋める必要はありません。なぜ私はその特定の分野でエラーが出るのか混乱しています。

誰もが洞察力を持っているなら、私は本当に感謝します。ありがとう。

編集:もう少し考えて研究をしたところ、問題の内容を知っていると思います。 TBLPOCのエンティティモデルでは、cntPOCOrganizationフィールドはnullですが、TBLPOCORGANIZATIONというこのエンティティモデルに関連付けられたオブジェクトがあります。私はそれを埋めるしようとしている場合は熟考している。それ自体にcntPOCOrganizationもあります。私はおそらくそれ自体を埋もうとしていると推測していますし、問題の原因となっています。

これはおそらく、以前の請負業者がOracleコマンドを書いていたのに対してEntity Frameworkを使って実行していた理由です。私は当分の間、元に戻ります(締め切りで、実際にはあまりにも長くプレイしたくありません)。ありがとう!

+0

フレームワークがオブジェクトを記入するのに必要なすべてのフィールドが読者にないように聞こえます。 – JuanR

+0

前にも触れましたが、問題はこのエンティティに関連付けられた子エンティティであると思います。読者はそれらに注意し、子オブジェクトに非ヌルがあるため、エラーがスローされます。また、クエリに基づいてフィールドのほとんどすべてがオブジェクトに欠落している可能性もあります(実際には10〜15個のフィールドがより多く存在する場合、クエリは3つのフィールドのみを取得します)。 – IyaTaisho

+0

はい、あなたは正しい道にいると思います。 EFに質問の結果をマップして、読者がすべてを持っていることを期待しています。私は不思議です、フィールド "cntPOCOrganization"はオブジェクトかセットですか?それはオブジェクトであり、それはデータベース上で1対1の関係でなければなりません。 – JuanR

答えて

0

このエラーは、EFエンティティモデルがクエリ結果と一致しない場合に発生します。これをフェッチしようとしているエンティティモデルを投稿すると、SQLを修正できます。一般的には、次のものを使用する必要があります。

sql = string.Format(@"SELECT tblPOC.cntPOC AS <your_EF_model_property_name_here>,INITCAP(strLastName) AS <your_EF_model_property_name_here>,INITCAP(strFirstName) AS <your_EF_model_property_name_here> 
         FROM tblPOC,tblParcelToPOC 
         WHERE tblParcelToPOC.cntPOC = tblPOC.cntPOC 
          AND tblParcelToPOC.cntAsOf = 0 
          AND tblParcelToPOC.cntParcel = {0} 
         ORDER BY INITCAP(strLastName)", 
         cntParcel); 
+0

私は同じことを考えたので投稿した後に名前を修正しました。しかし、私はまだ同じエラーが発生します。 – IyaTaisho