0

クエリ変数を調べてこれらのコード行をデバッグすると、System.Data.EntityExceptionが表示されます。

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

var query = context.Units.SqlQuery("WITH x(Id) AS
  (SELECT @UnitId UNION ALL SELECT Unit.UnitId
  FROM Unit JOIN x ON Unit.ParentId = x.Id ) " +
  "DELETE Unit FROM x JOIN Unit ON Unit.UnitId = x.Id",
  new SqlParameter("UnitId", unit.UnitId));

SqlManagementStudioで実行される生のSQLは正常に実行されます。

このデータリーダーの問題は何ですか?うーん...実際に私は選択を行いますが、その後削除...これは非クエリです。それが問題ですか?ところで。私は最初にコードを使用します。

アップデート

例外メッセージを更新して修正しました。

SqlParameter名「@UnitId」に@記号を追加しても効果はありませんでした。

この例外は発生しますが、UnitIdとその子は削除されます!!!

他の誰かが同じ問題を抱えているようです:http ://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/17bdad58-93dd-4ba8-8a60-5177f3ce4a88

4

1 に答える 1

1

SqlParameter宣言が正しくありません。まず、パラメーター名の前に@が必要です(クエリでも)。次に、使用しているオーバーロードされたコンストラクターは、コンストラクターと定期的に混同されます。

public SqlParameter(
    string parameterName,
    SqlDbType dbType
)

また、クエリを実行するために間違ったメソッドを呼び出しています。SqlQueryは、SQLがエンティティにマップする必要のあるデータを返すことを前提としています。したがって、コードを次のように変更します。

var parm = new SqlParameter("@UnitId", SqlDbType.Int);
parm.Value = unit.UnitId
context.Database.ExecuteSqlCommand("WITH x(Id) AS
  (SELECT @UnitId UNION ALL SELECT Unit.UnitId
  FROM Unit JOIN x ON Unit.ParentId = x.Id ) " +
  "DELETE Unit FROM x JOIN Unit ON Unit.UnitId = x.Id", parm);

SqlParameterコンストラクターでSqlDbTypeを適切に設定してください。サンプルには32ビット整数を想定しました。

于 2013-01-31T17:54:32.577 に答える