快速信息:
问题:
对于主键设置为identity的实体,DatabaseGeneratedOption.Identity应该可以正常工作。
但是,在我们当前的架构中,有一种“有趣”的方式来创建主键。调用存储过程创建要使用的“下一个”唯一键(为几个不同的表调用相同的sproc以确保所有这些键都具有唯一键)。这是一个遗留的结构,我不打算在这篇文章中介绍,但我需要能够实现它。
我将地图设置为DatabaseGeneratedOption.None。在插入记录之前处理新id的检索的最佳方法是什么?我可以在DbContext上处理一个事件吗?
谢谢!
答案 0 :(得分:1)
DatabaseGeneratedOption的值设置EF处理属性的方式:
None
- 标准财产。 EF将在select期间加载其值,允许应用程序修改该值并保留该值。Identity
- EF希望在插入记录时由数据库设置此属性。插入记录时,EF会自动将此值加载回实体。它不必是数据库中的标识列 - 它也可以是触发器生成的值。应用程序无法为标记为标识的属性设置值Computed
- EF希望每次修改后该属性都可以在数据库中更改。它在每次插入或更新后重新加载值。应用程序无法为标记为identity的属性设置值。因此,如果您想在应用程序中调用该过程,则必须使用None
。例如,如果您决定在插入触发器之前使用以执行该过程,则必须使用Identity
。
DatabaseGeneratedOption.Identity
表示在插入记录时将在数据库中设置值。 DatabaseGeneratedOption.Computed
表示每次更新记录时都会在数据库中设置值。