使用Entity Framework保存对象时会发生什么?

时间:2013-03-07 08:17:01

标签: c# entity-framework guid

可能听起来像一个愚蠢的问题,但有一个方面我想知道:

我正在处理具有PrimaryKeys的Guid属性的对象,这些对象在数据库中自动生成。我正在使用Entity Framework,Code First。如果我在保存之前使用此属性执行Console.WriteLine,则值为
00000000-0000-0000-0000-000000000000

在上下文中使用Add和SaveChanges之后,如果我再次使用相同的属性执行Console.WriteLine,我有一个值:
615f98eb-4ced-422A-877F-b9caa6f2b91f

显然,内存中的对象已经更新。但我想知道如何。 Guid是在数据库中生成的,那么会发生什么?

对象的Guid属性是否只是通过EF从数据库更新,或者在将数据保存到数据库中后将EF重新加载到内存中?

我想知道,因为这将决定我如何在同一个项目中设计NUnit-tests

2 个答案:

答案 0 :(得分:1)

EF不仅提交插入/更新语句,同时还执行get语句来检索生成的主键。实际上它只是一个查询。然后使用检索到的主键更新您实体的主键。这背后没有魔法。

这也是不支持批量更新/插入的原因之一。每个实体都必须自行更新/插入。

这是在插入具有计算的int主键的实体时执行的查询:

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

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

如您所见,insert语句后跟一个select语句,检索计算列(在本例中为ID)。如果有更多的计算列,则在这里选择它们。

答案 1 :(得分:1)

调用domainContext.SaveChanges()时,您的EF对象会更新;您的新Id由SQL数据库生成,Id的值是DB的返回值。对于数据类型int,Guid和类似数据也是如此。

相关问题