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));

在 Sql Management Studio 中执行的原始 SQL 运行良好。

这个数据读取器有什么问题?嗯......实际上我做了一个选择,但在它之后删除......这是一个非查询。那是问题吗?顺便提一句。我首先使用代码。

更新

我已更新并更正了异常消息。

将 @-symbol 添加到 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 回答