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

时间:2012-03-19 08:25:38

标签: c# linq-to-sql

我想使用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溢出。必须在1/1/1753 12:00:00 AM之间   12/31/9999 11:59:59 PM。

这基本上意味着它尝试针对SQL日期时间验证.net默认日期时间

有没有办法删除不可空的实体而无需预取它?

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

  

未找到或更改行。

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

尝试更改

public DateTime TestDate { get; set; }

public DateTime? TestDate { get; set; }

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