删除实体,而不首先在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值设置为一个伪值,在这种情况下,我得到了以下内容:
未找到或更改行。
"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