Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取具有ObjectContext的关系记录的主键_C#_.net_Entity Framework_Audit - Fatal编程技术网

C# 获取具有ObjectContext的关系记录的主键

C# 获取具有ObjectContext的关系记录的主键,c#,.net,entity-framework,audit,C#,.net,Entity Framework,Audit,我尝试使用EF中的ChangeTracker进行审核,并将所有更改保存在数据库中(添加+更新) 因此,使用ChangeTracker我将能够获得所有更改的表,以及每个表的所有值。但我还需要新表中新记录的ID 其中一些是关系,当我尝试使用EntityKey获取值时,主键是0 private object GetPrimaryKeyValue(DbEntityEntry entry) { var objectStateEntry = ((IObjectContextAdapter)this)

我尝试使用EF中的
ChangeTracker
进行审核,并将所有更改保存在数据库中(添加+更新)

因此,使用
ChangeTracker
我将能够获得所有更改的表,以及每个表的所有值。但我还需要新表中新记录的ID

其中一些是关系,当我尝试使用
EntityKey
获取值时,主键是0

private object GetPrimaryKeyValue(DbEntityEntry entry)
{
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
    return objectStateEntry.EntityKey.EntityKeyValues[0].Value;    
}
有人知道,如果我走错了路,是否有可能获得相关实体的主键

谢谢

我认为您得到了0(默认值为(int)),因为只有在保存完成后(即
dbContext.SaveChanges
已成功完成)才会填充自动递增(identity)列。尝试读取
SaveChanges()之后的值,如建议的那样


这看起来像是一种捕获新添加值的方法,您必须覆盖SaveChanges并像前面提到的那样自己获取生成的值。

我认为您需要检查数据库表。如果它是主键,则不能为null(请参阅)。事实上,我说错了,它不是null,而是0。主键是表中的一个自动递增字段。是的,但我要做的是将所有新添加的值保存到另一个表中,为此,我使用EF的ChangeTracker检索所有这些值。当它涉及现有数据的更新时,这不是问题,但在本例中,它是针对新行的,主键是0。我在回答中添加了一个额外的引用。请注意:由于我不喜欢触发器,所以我喜欢.NET解决方案。但是,请记住,如果表数据可以由您自己的应用程序以外的其他应用程序更改,则触发器可能更合适。好的,Alexei,您的建议和引用对我没有帮助,因为我得到了相同的结果,主键为0。如果我在调用
SaveChanges()
后执行审核,我将丢失
EntityState
值(在本例中添加),但如果检查状态
Unchanged
我新添加的对象包含所有值,ID也包含在内。您认为对新添加的对象使用调用
SaveChanges()
后的状态Unchanged正确吗?