我想使用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默认日期时间
有没有办法删除不可空的实体而无需预取它?
*注意我已尝试将日期时间值设置为虚拟值,在这种情况下,我得到以下内容:
未找到或更改行。
答案 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