删除实体,而不首先在Linq2SQL中加载

本文关键字:Linq2SQL 加载 实体 删除 | 更新日期: 2023-09-27 18:28:09

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

我强调这可以按如下方式完成(删除LINQ到SQL记录而不首先加载它):

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溢出。必须介于1/1/1753 12:00:00 AM和9999年12月31日下午11:59:59。

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

有没有一种方法可以删除不可为null的实体而不需要预取它?

*注意,我还尝试将datetime值设置为一个伪值,在这种情况下,我得到了以下内容:

未找到或更改行。

删除实体,而不首先在Linq2SQL中加载

"Row not found or changed"(未找到或更改行)建议您设置这些列进行验证。如果您有一个时间戳(rowversion)列,您可以使用该单个值进行乐观并发检查,当然,尽管您仍然不知道该值。在某些情况下,您可以完全禁用并发检查(在dbml中所有感兴趣的列上设置UpdateCheck="Never")。

然而,也许一个更简单的选择是:

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

或者类似的东西。不是面向对象的,但非常有效。请注意,除非您自己管理事务,否则这不会在与SubmitChanges相同的事务中运行,并且它不会验证是否正好删除了1行。但这是直接的。还要注意的是,数据上下文不会知道这个更改,所以如果您的数据上下文也有(比如)该行的挂起更新,它可能会混淆。

尝试更改

public DateTime TestDate { get; set; }

public DateTime? TestDate { get; set; }

并在数据库表中设置此字段NULLable