現在、私はメンテナンスのために契約しているアプリケーションのバックエンドでいくつかのコードのクリーンアップに取り組んでいます。私は、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を使って実行していた理由です。私は当分の間、元に戻ります(締め切りで、実際にはあまりにも長くプレイしたくありません)。ありがとう!
フレームワークがオブジェクトを記入するのに必要なすべてのフィールドが読者にないように聞こえます。 – JuanR
前にも触れましたが、問題はこのエンティティに関連付けられた子エンティティであると思います。読者はそれらに注意し、子オブジェクトに非ヌルがあるため、エラーがスローされます。また、クエリに基づいてフィールドのほとんどすべてがオブジェクトに欠落している可能性もあります(実際には10〜15個のフィールドがより多く存在する場合、クエリは3つのフィールドのみを取得します)。 – IyaTaisho
はい、あなたは正しい道にいると思います。 EFに質問の結果をマップして、読者がすべてを持っていることを期待しています。私は不思議です、フィールド "cntPOCOrganization"はオブジェクトかセットですか?それはオブジェクトであり、それはデータベース上で1対1の関係でなければなりません。 – JuanR