LINQ删除 - 可以删除一种方式,不能使用Single枚举

时间:2009-07-27 19:16:54

标签: sql-server database linq linq-to-sql ado.net

这有效:

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

2 个答案:

答案 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)

您最近是否更改过数据库中的数据类型? (也许这些类型目前与您生成的类不同)

同样,如果您使用存储过程删除项目,请确保参数类型与您生成的类型相匹配。