可能听起来像一个愚蠢的问题,但有一个方面我想知道:
我正在处理具有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
。
答案 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和类似数据也是如此。