2013-03-07 71 views
1

大概聽起來像一個愚蠢的問題,但有一個方面關於它我想知道:使用實體框架保存對象時會發生什麼?

我正在處理具有Guid屬性的PrimaryKeys,它會在數據庫中自動生成。我使用的是實體框架,Code First。如果我在保存之前使用此屬性執行Console.WriteLine,則值爲
00000000-0000-0000-0000-000000000000

使用添加和調用SaveChanges的背景下,如果我有相同的屬性再做一個Console.WriteLine之後,我有一個值:
615f98eb-4ced-422A-877F-b9caa6f2b91f

顯然,在內存中的對象已經更新。但我想知道如何。 Guid在數據庫中生成,所以會發生什麼?

對象的Guid屬性是否簡單地通過EF從數據庫更新,還是將EF保存到數據庫後將整個對象重新加載到內存中?

我想知道,因爲這將決定我如何在同一個項目中設計NUnit-tests

+0

您可以使用[MiniProfiler](http://miniprofiler.com/)這樣的工具來查看生成併發送到數據庫的sql。 – SWeko 2013-03-07 08:21:52

+0

對於我來說,使用SQL Server生成的GUID似乎有點奇怪。通常,GUID的優點在於它們可以由客戶端生成。 – Aron 2013-03-07 08:29:48

+0

Genereally,但不總是。 ;-)它有它的用途。 – JustAnotherUserYouMayKnow 2013-03-07 08:32:57

回答

1

當您調用domainContext.SaveChanges();您的EF對象已更新。您的新ID由SQL數據庫生成,Id的值是從數據庫返回的值。數據類型int,Guid和類似數據是一樣的。

1

EF不僅提交插入/更新語句,同時它還執行get語句來檢索生成的主鍵。實際上它只是一個單一的查詢。然後使用檢索到的實體的主鍵更新實體的主鍵。這背後沒有魔法。

這也是批量更新/插入不支持的原因之一。每個實體都必須自行更新/插入。

這是一個計算INT主鍵插入一個實體時,正在執行的查詢:

insert [dbo].[TestTable] 
     ([Name]) 
values ('myname' /* @0 */) 

select [ID] 
from [dbo].[TestTable] 
where @@ROWCOUNT > 0 
     and [ID] = scope_identity() 

正如你所看到的,插入語句後面是SELECT語句檢索計算列(在這個案例ID)。如果有更多的計算列,它們都在這裏被選中。