这有效:
var i = (from x in db.Test
where x.Id == 1
select x).First();
db.Test.DeleteOnSubmit(i);
db.SubmitChanges();
我得到了一个强制转换错误(int / string):
var i = db.Test.Single(x => x.Id == 1);
db.Test.DeleteOnSubmit(i);
db.SubmitChanges();
我还能够在同一张桌子上使用Single成功进行更新。有线索吗?
更新
以下是更多错误消息:
以下是更多信息:
[InvalidCastException:无法将'System.Int32'类型的对象强制转换为'System.String'。]
System.Data.Linq.SingleKeyManager 2.TryCreateKeyFromValues(Object[] values, V& v) +134
System.Data.Linq.IdentityCache
2.Find(Object [] keyValues)+57
System.Data.Linq.StandardIdentityManager.Find(MetaType type,Object [] keyValues)+51
System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type,Object [] keyValues)+113
System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc,Object instance)+235
System.Data.Linq.ChangeProcessor.BuildEdgeMaps()+ 510
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)+137
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)+453
System.Data.Linq.DataContext.SubmitChanges()+38
答案 0 :(得分:2)
您的ID字段的数据类型是什么?
我刚刚针对一个虚拟数据库运行了以下代码,其中包含数据,其中我的关键字段是int类型:
using (var db = new dbDataContext())
{
var x = db.items.Single(i => i.fld_key == 1);
db.items.DeleteOnSubmit(x);
db.SubmitChanges();
var y = (from i in db.items
where i.fld_key == 2
select i).First();
db.items.DeleteOnSubmit(y);
db.SubmitChanges();
}
我也没有遇到任何问题,并检查数据库,第1项和第2项都被成功删除。
您是否尝试删除第二个代码块中不存在的项目 - 当您使用第一个代码块删除它时。这意味着y实际上是null并且您正在尝试DeleteOnSubmit传递null,这将导致无效的转换,因为您无法转换为null。
尝试在第二个代码块中尝试删除不同的项目,我认为在这种情况下它会起作用。
更改。单击.SingleOrDefault并包装删除行以检查null:
if(null != x)
{
db.items.DeleteOnSubmit(x);
db.SubmitChanges();
}
我会打赌这会解决你所看到的问题。
编辑查看您发布的异常,我想知道在生成dbml之后是否将表的数据类型更改为int。将表重新加载到dbml中,看看是否能解决问题。要么是这样,要么问题是相反的,你把它改为VarChar / NVarChar并且没有更新你的dbml。
我肯定会查看您的实体,并确保数据类型与基础数据库中数据表中的数据类型相匹配。
答案 1 :(得分:1)
您最近是否更改过数据库中的数据类型? (也许这些类型目前与您生成的类不同)
同样,如果您使用存储过程删除项目,请确保参数类型与您生成的类型相匹配。