从Entity Framework执行语句时的SQL转换错误,但在执行相应的sql时工作正常

时间:2013-01-11 12:53:44

标签: sql-server entity-framework

我有一段代码,我在其中添加对象并从对象上下文中删除另一个。保存对象上下文的更改时,会引发以下SQL异常:

  

将nvarchar值'KV Oberaargau136'转换为数据类型int

失败

当然'KV Oberaargau136'无法转换为int值,麻烦的是我不知道该字符串是如何到达那里的。字符串可以来自的唯一地方来自以下代码:

History h = new History()
{
    idTableRef = rpo.idOA,
    tableRef = "RelPersonOrganism",
    date = now,
    idResponsible = entities.getUserOA().id,
    data = "<delete><organism><name><![CDATA[%name%]]></name><id>%id%</id></organism></delete>"
        .Replace("%name%", organism.defaultName)
        .Replace("%id%", organism.idOA.ToString())
};

其中History是一个实体,data是一个字符串(实际上是SQL Server上的xml数据类型)

所以我试图用SQL Profiler看看哪些SQL语句可以引发异常,这里是引发异常的跟踪部分:

RPC:Starting        exec sp_executesql N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idResp...
SQLTransaction
Exception           Error: 245, Severity: 16, State: 1
User Error Message  Conversion failed when converting the nvarchar value 'KV Oberaarau136' to data type int.
SQLTransaction
SP:Completed        insert [dbo].[History]([tableRef], [idTableRef], [date], [idResponsible], [data]) v...
RPC:Completed       exec sp_executesql N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idRespon...

完整的SQL语句(在上面的跟踪中显示3次)是:

EXEC sp_executesql
  N'insert [dbo].[History]([tableRef], [idTableRef], [date], [idResponsible], [data])
values (@0, @1, @2, @3, @4)
select [id]
from [dbo].[History]
where @@ROWCOUNT > 0 and [id] = scope_identity()',
  N'@0 nvarchar(255),@1 int,@2    datetime2(7),@3 int,@4 nvarchar(max) ',
  @0=N'RelPersonOrganism',
  @1=1255,
  @2='2013-01-11     12:35:18.4984109',
  @3=1,
  @4=N'<delete><organism><name><![CDATA[KV Oberaargau]]></name><id>136</id></organism></delete>'

因此,通过查看跟踪,我得出结论认为这个SQL语句是有罪的,尽管它对我来说根本没有错。所以我尝试在SQL Server Management Studio中执行它,它完美无缺,没有错误......

那么什么可能触发那个错误?

1 个答案:

答案 0 :(得分:1)

我看不出您发布的查询是否会以任何方式直接导致该错误消息。

因此,请检查是否有任何解析XML的触发器或计算列,可能是原因。