2009-08-17 108 views
1

我正在使用实体框架挂钩到旧的遗留数据库的WPF系统上。我们在调试时挂接到实时数据的备份,并在空数据库上运行测试。仅当尝试从实时数据的备份中删除时,我收到以下错误。Linq到实体/实体框架删除异常

此代码:

License license = ReadLicense(id); 
entities.DeleteObject(license); 
entities.SaveChanges(); 

产生此SQL:

exec sp_executesql N'delete [dbo].[Product] 
where ((([Group_ID] = @0) and ([Parent_ID] = @1)) and ([Prod_ID] = @2))',N'@0 nvarchar(32),@1 nvarchar(32),@2 nvarchar(32)',@0=N'someIdValue1',@1=N'someIdValue2',@2=N'someIdValue3' 

这又产生这样的错误:

消息208,级别16,状态1,过程TrackDeletedProduct,4号线。 无效的对象名称'DeletedRecords.dbo.Product_Deleted'。

如果将生成的SQL更改为“select”查询,则返回一行,所以'ReadLicense'返回一个有效的实体。我无法真正理解为什么这不起作用,尤其是当它仅针对实时数据时。 “许可”实体是从基础“产品”实体继承的两个实体之一。

干杯。

回答

5

从我所看到的情况来看,它好像是表Product上有一个触发器,当你删除一行并调用存储过程TrackDeletedProduct时,它将触发。

该过程将(仅在此处猜测)尝试将产品条目复制到DeletedRecords数据库中的Product_Deleted表中,但在该数据库上失败 - 无论其他数据库还是该表似乎都不存在。

所以我不认为这与ADO.NET Entity Framework或LINQ-to-Entities有什么关系,但与SQL Server有很大关系 - 请检查您的后端数据库配置!

Marc

+1

非常感谢你的男人,没想到表触发器。仅供参考,数据库的空白版本是从备份的创建脚本的减少版本创建的,我发现自从向您的同事表明您是解决方案后,我发现了这一点。所以触发器根本不在那里。 Rekon我应该编辑标签?可以帮助其他人... – andrej351 2009-08-17 05:29:40

+0

很高兴我能帮上忙 - 我会让标签保持原样 - 没问题。 – 2009-08-17 05:37:52