【问题标题】:Entity Framework - Database generated identity is not populated after save if it is not the key of the entity实体框架 - 如果数据库生成的身份不是实体的键,则在保存后不会填充数据库生成的身份
【发布时间】:2020-02-13 01:33:34
【问题描述】:

我有一个类似的模型

public class MyEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public int Id { get; set; } // Id

    [Required]
    [Key]
    public System.Guid GUID { get; set; }
}

GUID 属性是设计上的 PK,但我有一个 db 生成的 Id 属性,我在代码中使用它来确定对象是否是尚未保存的新对象。

当我使用 Entity Framework 保存此对象时,Id 属性不会像数据库生成的属性(尽管通常这些是键)那样重新填充。我必须在数据库中查询对象并手动获取 ID。似乎 EF 只返回填充 SaveChanges 上的 Key 属性。

有没有办法让 EF 在这里自动填充 Id 属性?将其设置为键不是一个选项,我有几十个表是 FK 到 GUID 属性的,这是有充分理由的。

编辑:我发现包https://entityframework-extensions.net/ 正在处理我的保存更改。如果我使用标准的 EF savechanges 它可以工作,但不能使用扩展版本。

【问题讨论】:

  • 我无法重现此行为 /w EF6.我创建了一个带有 GUID PK 的表,既使用 DB 默认值,又在代码中设置 PK,以及 Identity 辅助非键字段,将实体插入到 Context DbSet 中,并且在 SaveChanges 之后,Identity 值可用。您能否扩展您的代码以准确显示您是如何填充和保存该实体的?
  • 好吧,我挖得更深一点,发现在我的应用程序的存储库层中有一个名为 entityframework-extensions.net 的框架正在处理批量操作的保存更改,并且单个项目也被推送通过批量保存更改方法。如果我切换到常规的 EF saveChanges,它会按照您的描述工作,但使用扩展程序,它就像在我的场景中一样工作。

标签: entity-framework entity-framework-6 entity-framework-extensions


【解决方案1】:

免责声明:我是Entity Framework Extensions的所有者

这确实是我们图书馆的一个问题。 EF6 尚不支持此方案。

但是,从 v4.0.50 开始,它现在应该可以按预期工作了。

【讨论】:

  • 感谢您的快速周转!我在 github 上提交了问题,并在一周内修复。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2023-03-09
相关资源
最近更新 更多