【问题标题】:Remove entity without loading first in Linq2SQL在 Linq2SQL 中删除实体而不先加载
【发布时间】:2012-03-19 08:25:37
【问题描述】:

我想使用 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 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59。

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

有没有一种方法可以在不需要预取的情况下删除一个不可为空的实体?

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

未找到或更改行。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

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

    不过,也许更简单的选择是:

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

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

    【讨论】:

    • @Luke 当心:这意味着您也不会对更新进行并发检查。
    • 应该没问题我实际上只是将它用于性能测试并在之后验证状态
    【解决方案2】:

    尝试改变

    public DateTime TestDate { get; set; }
    

    public DateTime? TestDate { get; set; }
    

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

    【讨论】:

    • 我想在不将其设置为可为空的情况下执行此操作。我不应该改变我的模型来快速删除
    • 好吧,你还没有注意到这一点。更改数据模型或 orm 层中字段的默认值怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2012-03-24
    • 2014-08-21
    • 2010-11-21
    相关资源
    最近更新 更多