2011-03-17 27 views
10

我对什么是StoreGeneratedPattern的最高性能方式感兴趣。实体框架中推荐的身份生成方法是什么?

在过去,我是用来让数据库生成的ID为我,但我不知道是否有在设定的

StoreGeneratedPattern = Identity 

StoreGeneratedPattern = None 

,而不是任何优势,我甚至不能确定当我将其设置为“计算”时发生了什么。

有什么建议吗?有没有什么好的文章与此相关,因为msdn不是很具说明性。我在我的模式中主要使用几个GUID。

回答

20

查看我的blog postStoreGeneratedPattern。它解释了IdentityComputed之间的一些区别。当使用StoreGeneratedPattern作为ID(PK)时,如果您在应用程序中分配了ID,则正确的选项是None;如果您在数据库中分配了ID,则使用IdentityComputed选项是“无效的”,因为在每个实体持久性期间(也在更新中)更改值时使用此选项,并且不是ID的情况。

IdentityComputed之间的差异是执行的SQL命令的行为。如果属性为Identity,EF将在插入后选择该值并将其返回给您的应用程序。如果属性为Computed EF将在插入和更新后选择值并将其返回给您的应用程序。

编辑:

StoreGeneratedPattern.Identity在DB是不相关的身份。您不需要在数据库中拥有Identity,并且可以使用某种不同的techinque(guid或trigger的默认值)设置ID,但仍需要StoreGeneratedPattern.Identity才能将价值返回给您的应用程序。

一旦您使用IdentityComputed EF将始终关注每个插入或更新并带有选择以生成db生成的列。没有它,它就无法工作。这些命令在数据库中单向往返执行,因此几乎没有性能影响。

+0

谢谢,这主要回答我的问题。还有一个困境。我可以在数据库中设置ID列不是身份,但仍然是主键。 在这种情况下,EF将为我生成新的ID。它是如何做的?两个sql查询?它有效吗?我没有分析器。谢谢 – Marek 2011-03-17 09:55:54