Entity framework 在实体框架核心2中取消设置主键

Entity framework 在实体框架核心2中取消设置主键,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我正在为模型使用整数主键,这些模型由EntityFrameworkCore2存储在数据库中。我需要检查模型的主键是实体框架指定的最终值还是尚未指定。我还没有找到用于此的确切值的文档,因此我想确认我的猜测: 看起来主键从1开始,在数据库中永远不为0 由于整数的默认值是0,因此我可以安全地假设,如果一个键是0,则它是未设置的 这是否正确?不确定您需要这些信息的位置和原因。但EF Core提供了两种现成的方法 首先是财产: 获取一个值,该值指示是否已为此实体的键值分配了值 对于具有存储生成属性(例

我正在为模型使用整数主键,这些模型由EntityFrameworkCore2存储在数据库中。我需要检查模型的主键是实体框架指定的最终值还是尚未指定。我还没有找到用于此的确切值的文档,因此我想确认我的猜测:

  • 看起来主键从1开始,在数据库中永远不为0
  • 由于整数的默认值是0,因此我可以安全地假设,如果一个键是0,则它是未设置的

这是否正确?

不确定您需要这些信息的位置和原因。但EF Core提供了两种现成的方法

首先是财产:

获取一个值,该值指示是否已为此实体的键值分配了值

对于具有存储生成属性(例如映射到标识列)的键,如果任何存储生成的属性具有CLR默认值,则返回值将为false

对于没有任何存储生成属性的键,返回值将始终为true,因为任何值都被视为有效的键值

虽然这基本上与您的假设中的逻辑相同,但最好在可能的情况下使用它,而不是您自己的硬编码逻辑:

context.Entry(entity).IsKeySet
第二是财产:

获取或设置一个值,该值指示此属性的值是否被视为临时值,当调用
SaveChanges()
时,该值将被从存储生成的值替换

例如,EF Core在将实体插入数据库之前为标识列生成临时值,然后用实际值替换它们。如果需要知道值是否为最终值,则可以使用此属性

context.Entry(entity).Property(e => e.Id).IsTemprorary

我想要获得这些信息的原因是,我希望来自不同DbContext实例的模型可以与Equals()和GetHashCode()进行比较。我正在为此使用主键,但如果主键未设置/为默认值,则这不起作用。你提到的方法对我来说是行不通的,因为模型不知道EntityFramework的实体。好吧,你没有在你的问题中加入这样的约束。无论如何,只要使用您的假设(正如回答中指出的,
IsKeySet
属性的文档证实了这一点)。您还可以使用check来检查指示临时键的负值。但是请注意,临时密钥在不同的数据库上下文中是不同的,因此这种技术是不可靠的。第一个假设应该成立。谢谢你的确认!