有人为实体框架实现了 HiLO 密钥生成器吗?
在这里阅读更多关于 HiLo 的信息: 我建议你阅读 http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html 详细解释选择身份的缺点。
是的,有人已经为 Entity Framework 实现了 HiLO。我自己还没有测试过: http://web.archive.org/web/20170504090037/http://joseoncode.com/2011/03/23/hilo-for-entityframework/
谢谢解答
我想我只需要等待 :-) EF 正朝着正确的方向前进,喜欢 CTP5。
我需要评论“说唱”的答案。使用随机 Guid 作为索引确实会降低 SQL Server 的性能,因为每个插入的索引都会变得碎片化。 这是我从现实世界中学到的,当我开始在一家新公司工作时,那里的 sql server 性能存在很大问题。从 guid 转移到 bigint 解决了这个问题。并且不需要一直重新索引。
不幸的是,EF 没有像 NHibernate 那样非常接近 POID 生成器的任何东西,尽管我听说类似的功能将包含在下一版本的 EF 中。 (什么?!?微软选择了竞争对手的好主意?不可思议!)
自己处理HiLo的Lo部分不会太难,但是Hi部分就比较棘手了,除非我们能得到EF的配合。这将需要微软重构 EF 的一部分,这可能就是为什么没有人尝试这样做并将其作为开源项目发布在 github 或 codeplex 上的原因。
与此同时,我们用于离线生成记录然后在稍后同步的是全球唯一标识符。
var id = Guid.NewGuid();
然后将它分配给表的id。这可以在 SaveChanges 中完成。
我知道它不如 HiLo 好,但它已经很接近了。它仍然具有能够离线工作并保证有效且唯一的id的优点。
IMO 实体框架没有任何与 NHibernate 的生成器等效的东西。 EF 中唯一可用的功能是 StoreGeneratedPattern,它可以设置为 Identity。 StoreGeneratedPattern 只是意味着 DB 将分配一个键,并且该键作为插入操作的一部分返回到 EF 上下文(使用 Guid 更难)。
如果你想拥有一些等效于 NHibernate POID 生成器的东西,你必须覆盖 SaveChanges 或处理 ObjectContext 上的 SavingChanges。然后您可以从您选择的 POID 算法中手动将 ID 分配给所有插入的实体 - 但您必须实施该算法。
Entity Framework 7 有支持:https://channel9.msdn.com/Blogs/Seth-Juarez/Key-Generation-Strategies-in-Entity-Framework-7
public class ExampleContext : BaseContext {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ForSqlServerUseSequenceHiLo();
}
}