【问题标题】:LINQ deletion - Can delete one way, can't using Single enumerableLINQ 删除 - 可以删除一种方式,不能使用 Single enumerable
【发布时间】:2010-11-14 11:21:39
【问题描述】:

这行得通:

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.SingleKeyManager2.TryCreateKeyFromValues(Object[] values, V& v) +134 System.Data.Linq.IdentityCache2.Find(Object[] keyValues) +57 System.Data.Linq.StandardIdentityManager.Find(MetaType type, Object[] keyValues) +51 System.Data.Linq.CommonDataServices.GetCachedObject(MetaType 类型,Object[] keyValues)+113 System.Data.Linq.ChangeProcessor.GetOtherItem(元关联关联,对象实例)+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

【问题讨论】:

  • 你提到你得到一个演员错误,但它来自哪里?它是否为您提供了更多信息?

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


【解决方案1】:

你的 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。

尝试在你的第二个代码块中删除一个不同的项,我想在这种情况下它会起作用。

将 .Single 更改为 .SingleOrDefault 并包装您的删除行以检查是否为空:

if(null != x)
{
    db.items.DeleteOnSubmit(x);
    db.SubmitChanges();
}

我敢打赌,这将解决您看到的问题。

编辑查看您发布的异常,我想知道您是否在生成 dbml 后将表的数据类型更改为 int。将表重新加载到您的 dbml 中,看看是否能解决问题。要么这样,要么问题是相反的,您将其更改为 VarChar/NVarChar 并且尚未更新您的 dbml。

我肯定会查看您的实体,并确保数据类型与基础数据库中数据表中的数据类型相匹配。

【讨论】:

  • 这有帮助。我认为实体有问题。有一个协会。这给了我一些检查。
  • 我认为var i = db.Test.Single(x => x.Id == 1); 会在不存在的情况下抛出异常(通常情况下)......但我猜 LinqToSql 可能会发现你正在尝试获取相同的项目并将其提供给您,而不是实际查询。这看起来很奇怪,但我很想看看这是否是问题所在。
  • 我必须为不完整的信息辩护,因为该表已通过 fk 链接到另一个表。我认为这是我的 LINQ 语法,所以我没有提到它。尝试从 fk 表中删除时出现错误。当我从父表中删除时,它会起作用并且删除会向下传播。谢谢。
  • 好吧,很高兴你在这两种情况下都解决了。至少我们有一个问题、一个问题的合理答案和一个解决方案,即使它们并不是连贯地联系在一起的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多