gpt4 book ai didi

c# - 在 Linq2SQL 中不先加载就删除实体

转载 作者:太空狗 更新时间:2023-10-30 01:24:20 25 4
gpt4 key购买 nike

我想使用 LINQ2SQL 从数据库中删除一个实体,而不必预先获取它(出于性能原因)。

我理解这可以按如下方式完成(Delete a LINQ to SQL record without loading it first):

public void Delete(int id)
{
var e = new TestEntity { Id = id };

_context.TestEntities.Attach(e, false);
_context.TestEntities.DeleteOnSubmit(e);
}

然而,当 TestEntity 包含类似于以下内容的日期时间时:

public class TestEntity
{
public int Id { get; set; }
public String TestString { get; set; }
public DateTime TestDate { get; set; }
public int TestInt { get; set; }
}

我收到以下错误:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

这基本上意味着它试图根据 SQL 日期时间验证 .net 默认日期时间

有没有办法在不需要预取的情况下删除具有不可空值的实体?

*注意我还尝试将日期时间值设置为虚拟值,在这种情况下我得到以下信息:

Row not found or changed.

最佳答案

“未找到或更改行”表明您已将这些列设置为进行验证。如果您有时间戳 (rowversion) 列,您可以使用该单一值进行乐观并发检查,当然,您仍然不知道该值。在某些情况下,您可以完全 禁用并发检查(在 dbml 中所有有趣的列上设置 UpdateCheck="Never")。

但是,也许更简单的选择是:

_context.ExecuteCommand("delete from [TableName] where [PrimaryKey]={0}", id);

或类似的东西。不面向对象,但非常有效。请注意,这不会在与 SubmitChanges 相同的事务中运行,除非您自己管理事务,并且它不会验证是否恰好删除了 1 行。但它是直接的。另请注意,数据上下文不会知道此更改,因此如果您的数据上下文也有(比如说)该行的待处理更新,它可能会感到困惑。

关于c# - 在 Linq2SQL 中不先加载就删除实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9766960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com