是否有人为实体框架实现了 HiLO 密钥生成器。
在此处阅读有关 HiLo 的更多信息:我建议您阅读http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html以详细了解选择身份的缺点。
是否有人为实体框架实现了 HiLO 密钥生成器。
在此处阅读有关 HiLo 的更多信息:我建议您阅读http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html以详细了解选择身份的缺点。
是的,有人已经为实体框架实现了 HiLO。我自己还没有测试过:http: //joseoncode.com/2011/03/23/hilo-for-entityframework/
感谢您的回答
我想我只需要等待 :-) EF 正朝着正确的方向前进,喜欢 CTP5。
我需要评论“说唱”的答案。使用随机 Guid 作为索引确实会降低 SQL Server 的性能,因为每次插入的索引都会变得碎片化。这是我从现实世界中学到的,当我开始在一家新公司工作时,那里的 sql 服务器的性能存在很大问题。从 guid 到 bigint 解决了这个问题。并且没有必要一直重新索引。
不幸的是,EF 没有像 NHibernate 那样非常接近 POID 生成器的东西,尽管我听说类似的功能将包含在 EF 的下一个版本中。(什么?!?微软选择了竞争对手的好主意?不可思议!)
自己处理 HiLo 的 Lo 部分不会太难,但除非我们能让 EF 合作,否则 Hi 部分会很棘手。这将需要微软重构部分 EF,这可能就是为什么没有人尝试这样做并将其作为开源项目发布在 github 或 codeplex 上的原因。
同时,我们用于离线生成记录并稍后同步的是全局唯一标识符。
var id = Guid.NewGuid();
然后将其分配给表的 id。这可以在 SaveChanges 中完成。
我知道它不如 HiLo 好,但它和我们来的一样接近。它仍然具有能够离线工作并保证有效且唯一的 id 的优点。
IMO 实体框架没有任何等同于 NHibernate 的生成器。EF 中唯一可用的功能是可以设置为 Identity 的 StoreGeneratedPattern。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();
}
}