2012-03-19 33 views
4

我想要使用LINQ2SQL從數據庫中刪除一個實體,而不必預先獲取它(出於性能原因)。在Linq2SQL中先不加載第一個實體

我undersand是如下這是可以做到(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 overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

這基本上意味着它試圖驗證.net默認日期時間針對一個SQL日期時間

有沒有辦法刪除一個不可空的實體而無需預取它?

*注香港專業教育學院也嘗試設置日期時間值的虛設一個,在這種情況下,我得到如下:

Row not found or changed.

回答

4

的「未找到行或更改」,這表明你已經爲驗證設置這些列。如果您有時間戳(rowversion)列,您可以使用該單一值進行樂觀併發檢查,當然,您仍然不會知道該值。在某些情況下,您可以禁用併發檢查完全(在dbml中所有感興趣的列上設置UpdateCheck="Never")。

不過,或許是一個簡單的選擇是:

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

或類似的規定。不是面向對象的,但非常有效。請注意,除非您自己管理交易,並且不會驗證確切的1行已被刪除,否則這不會在與SubmitChanges相同的交易中運行。但它是直接的。還要注意數據上下文不會知道這個變化,所以如果你的數據上下文也有(比如說)該行的掛起更新,它可能會感到困惑。

+0

呀UpdateCheck的= 「從不」 的作品完美 – 2012-03-19 08:34:15

+0

@Luke請注意:這將意味着你也不會對你的更新進行併發檢查。 – 2012-03-19 09:13:38

+0

這應該是罰款我實際上只使用它進行性能測試無論如何和後驗證狀態 – 2012-03-19 10:15:04

0

試圖改變

public DateTime TestDate { get; set; } 

public DateTime? TestDate { get; set; } 

而且在數據庫表中設置該字段可爲空

+0

我想要做到這一點,而不是設置爲可空。我不應該改變我的模型,以便快速刪除 – 2012-03-19 08:36:15

+0

好的,你還沒有注意到這一點。如何改變datamodel或orm圖層中字段的默認值? – zabulus 2012-03-19 08:38:07

相關問題