Stored procedures 实体框架4.1-创建主键值

Stored procedures 实体框架4.1-创建主键值,stored-procedures,primary-key,entity-framework-4.1,identity,Stored Procedures,Primary Key,Entity Framework 4.1,Identity,快速信息: 首先使用EF4.1代码 使用没有属性装饰的POCO类 在EntityTypeConfiguration类中使用fluent配置将POCO映射到数据库 遵循DDD模式,使用通用存储库、聚合根、规范等 问题: 对于主键设置为identity的实体,DatabaseGenerateOption.identity应该可以正常工作 然而,在我们当前的模式中,有一种“有趣的”方法来创建主键。调用一个存储过程,创建要使用的“下一个”唯一键(对多个不同的表调用相同的存储过程,以确保所有表都具有唯

快速信息:

  • 首先使用EF4.1代码
  • 使用没有属性装饰的POCO类
  • 在EntityTypeConfiguration类中使用fluent配置将POCO映射到数据库
  • 遵循DDD模式,使用通用存储库、聚合根、规范等
问题:

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

然而,在我们当前的模式中,有一种“有趣的”方法来创建主键。调用一个存储过程,创建要使用的“下一个”唯一键(对多个不同的表调用相同的存储过程,以确保所有表都具有唯一键)。这是一个遗留结构,我不打算在本文中讨论,但我需要能够实现它

我正在将映射设置为DatabaseGeneratedOption.None。在插入记录之前处理新id检索的最佳方法是什么?是否有可以在DbContext上处理的事件


谢谢

DatabaseGeneratedOption的值设置EF如何处理属性:

  • -标准属性。EF将在选择期间加载其值,允许应用程序修改该值并保留该值
  • Identity
    -EF希望在插入记录时数据库会设置此属性。插入记录时,EF将自动将该值加载回实体。它不必是数据库中的标识列,也可以是触发器生成的值。应用程序无法为标记为标识的属性设置值
  • Computed
    -EF希望每次修改后数据库中的此属性都会更改。它在每次插入或更新后重新加载值。应用程序无法为标记为标识的属性设置值
因此,如果您想在应用程序中自己调用该过程,则必须使用
None
。例如,如果您决定使用before insert触发器来执行该过程,则必须使用
Identity


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

对不起,我应该把我文章的结尾写得更清楚一点。澄清:在实际插入之前设置ID(触发器对我们不起作用)的最佳方法是什么?在您的上下文中覆盖
SaveChanges
。在
ChangeTracker
中,找到处于
Added
状态的所有实体,并为每个实体调用该SP以设置其ID。再次感谢您的帮助:)