2013-03-07 69 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)。如果有更多的计算列,它们都在这里被选中。