实体框架的 HiLO

问题描述 投票:0回答:5

有人为实体框架实现了 HiLO 密钥生成器吗?

在这里阅读更多关于 HiLo 的信息: 我建议你阅读 http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html 详细解释选择身份的缺点。

entity-framework-4 hilo
5个回答
5
投票

是的,有人已经为 Entity Framework 实现了 HiLO。我自己还没有测试过: http://web.archive.org/web/20170504090037/http://joseoncode.com/2011/03/23/hilo-for-entityframework/


2
投票

谢谢解答

我想我只需要等待 :-) EF 正朝着正确的方向前进,喜欢 CTP5。

我需要评论“说唱”的答案。使用随机 Guid 作为索引确实会降低 SQL Server 的性能,因为每个插入的索引都会变得碎片化。 这是我从现实世界中学到的,当我开始在一家新公司工作时,那里的 sql server 性能存在很大问题。从 guid 转移到 bigint 解决了这个问题。并且不需要一直重新索引。


1
投票

不幸的是,EF 没有像 NHibernate 那样非常接近 POID 生成器的任何东西,尽管我听说类似的功能将包含在下一版本的 EF 中。 (什么?!?微软选择了竞争对手的好主意?不可思议!)

自己处理HiLo的Lo部分不会太难,但是Hi部分就比较棘手了,除非我们能得到EF的配合。这将需要微软重构 EF 的一部分,这可能就是为什么没有人尝试这样做并将其作为开源项目发布在 github 或 codeplex 上的原因。

与此同时,我们用于离线生成记录然后在稍后同步的是全球唯一标识符。

var id = Guid.NewGuid();

然后将它分配给表的id。这可以在 SaveChanges 中完成。

我知道它不如 HiLo 好,但它已经很接近了。它仍然具有能够离线工作并保证有效且唯一的id的优点。


0
投票

IMO 实体框架没有任何与 NHibernate 的生成器等效的东西。 EF 中唯一可用的功能是 StoreGeneratedPattern,它可以设置为 Identity。 StoreGeneratedPattern 只是意味着 DB 将分配一个键,并且该键作为插入操作的一部分返回到 EF 上下文(使用 Guid 更难)。

如果你想拥有一些等效于 NHibernate POID 生成器的东西,你必须覆盖 SaveChanges 或处理 ObjectContext 上的 SavingChanges。然后您可以从您选择的 POID 算法中手动将 ID 分配给所有插入的实体 - 但您必须实施该算法。


0
投票

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.