实体框架4.1 - 创建主键值

时间:2011-06-24 15:28:42

标签: stored-procedures primary-key entity-framework-4.1 identity

快速信息:

  • 首先使用EF 4.1 Code。
  • 使用没有属性修饰的POCO类。
  • 在EntityTypeConfiguration中使用流畅配置<>将POCO映射到数据库的类。
  • 遵循DDD模式,使用通用存储库,聚合根,规范等

问题:

对于主键设置为identity的实体,DatabaseGeneratedOption.Identity应该可以正常工作。

但是,在我们当前的架构中,有一种“有趣”的方式来创建主键。调用存储过程创建要使用的“下一个”唯一键(为几个不同的表调用相同的sproc以确保所有这些键都具有唯一键)。这是一个遗留的结构,我不打算在这篇文章中介绍,但我需要能够实现它。

我将地图设置为DatabaseGeneratedOption.None。在插入记录之前处理新id的检索的最佳方法是什么?我可以在DbContext上处理一个事件吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

DatabaseGeneratedOption的值设置EF处理属性的方式:

  • None - 标准财产。 EF将在select期间加载其值,允许应用程序修改该值并保留该值。
  • Identity - EF希望在插入记录时由数据库设置此属性。插入记录时,EF会自动将此值加载回实体。它不必是数据库中的标识列 - 它也可以是触发器生成的值。应用程序无法为标记为标识的属性设置值
  • Computed - EF希望每次修改后该属性都可以在数据库中更改。它在每次插入或更新后重新加载值。应用程序无法为标记为identity的属性设置值。

因此,如果您想在应用程序中调用该过程,则必须使用None。例如,如果您决定在插入触发器之前使用以执行该过程,则必须使用Identity

DatabaseGeneratedOption.Identity表示在插入记录时将在数据库中设置值。 DatabaseGeneratedOption.Computed表示每次更新记录时都会在数据库中设置值。