1

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

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

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

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

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

我想知道,因为这将决定我NUnit-tests在同一个项目中的设计方式。

4

2 回答 2

1

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

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

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

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

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

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

于 2013-03-07T08:28:00.443 回答
1

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

于 2013-03-07T08:28:34.753 回答