C# 使用实体框架保存对象时会发生什么情况?

C# 使用实体框架保存对象时会发生什么情况?,c#,entity-framework,guid,C#,Entity Framework,Guid,可能听起来是个愚蠢的问题,但我想知道其中的一个方面: 我正在处理具有PrimaryKeys Guid属性的对象,该属性在数据库中自动生成。我使用的是实体框架,代码优先。如果在保存之前使用此属性创建Console.WriteLine,则该值为 00000000-0000-0000-0000-00000000 在上下文中使用Add和SaveChanges之后,如果我使用相同的属性再次执行Console.WriteLine,我会得到一个值: 615f98eb-4ced-422a-877f-b9caa6

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

我正在处理具有PrimaryKeys Guid属性的对象,该属性在数据库中自动生成。我使用的是实体框架,代码优先。如果在保存之前使用此属性创建Console.WriteLine,则该值为
00000000-0000-0000-0000-00000000

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

显然,内存中的对象已被更新。但我想知道怎么做。Guid是在数据库中生成的,那么会发生什么呢

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


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

EF不仅提交Insert/Update语句,同时还执行get语句来检索生成的主键。事实上,这只是一个查询。然后,实体的主键将更新为检索到的主键。这背后没有魔力

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

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

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

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

如您所见,insert语句后面是一个select语句,用于检索计算列(在本例中为ID)。如果有更多的计算列,它们都会在此处被选中。

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

您可以使用类似的工具查看生成并发送到数据库的sql。使用sql Server生成的Guid对我来说似乎有点奇怪。一般来说,GUID ID的优点是它们可以由客户端生成。一般来说,但并不总是如此。;-)它有它的用途。