HiLO для Entity Framework

Кто-нибудь реализовал генератор ключей HiLO для Entity Framework.

Узнайте больше о HiLo здесь: я рекомендую вам прочитать http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html для подробного объяснения недостатков выбора идентичности.


person Martin Nyborg    schedule 02.07.2010    source источник
comment
если вы используете SQL Server, рассмотрите возможность добавления типа данных uniqueidentifier в SQL Server.   -  person Jahan    schedule 03.12.2010
comment
В чем конкретно заключается ваш вопрос?   -  person Chris Pfohl    schedule 20.12.2010


Ответы (5)


Да, кто-то реализовал HiLO для Entity Framework. Я сам его не тестировал: http://joseoncode.com/2011/03/23/hilo-for-entityframework/

person Maksymilian Majer    schedule 24.11.2011

Спасибо за ответы

Думаю, мне просто нужно подождать :-) EF движется в правильном направлении, люблю CTP5.

Мне нужно прокомментировать ответ «Рэпа». Использование случайных Guid в качестве индексов может действительно снизить производительность SQL Server, поскольку индексы для каждой вставки становятся фрагментированными. Я узнал об этом из реального мира, когда начал работать в новой компании, у которой были большие проблемы с производительностью на своих серверах sql. переход от guid к bigint решил проблему. и не было необходимости постоянно переиндексировать.

person Martin Nyborg    schedule 01.01.2011
comment
Да, это правда. Хороший звонок, @martin. Я просто сказал, что, поскольку EF еще нет, это все, что у нас есть на данный момент. - person Rap; 02.01.2011

К сожалению, у EF нет ничего очень близкого к генераторам POID, как у NHibernate, хотя до меня доходят слухи, что аналогичные возможности будут включены в следующий выпуск EF. (Что?!? Microsoft заимствует хорошую идею конкурента? Немыслимо!)

Было бы несложно справиться с Lo-частью HiLo самостоятельно, но с Hi-частью было бы сложно, если бы мы не смогли заставить EF сотрудничать. Это потребовало бы от Microsoft рефакторинга частей EF, поэтому, вероятно, никто не пытался это сделать и опубликовать как проект с открытым исходным кодом на github или codeplex.

Между тем, то, что мы использовали для создания записей в автономном режиме и последующей синхронизации, - это глобальный уникальный идентификатор.

var id = Guid.NewGuid();

Затем присваиваем его идентификатору таблицы. Это можно сделать в SaveChanges.

Я знаю, что это не так хорошо, как HiLo, но это так же близко, как мы подошли. У него все еще есть преимущества, заключающиеся в том, что он может работать в автономном режиме и гарантирует действительные и уникальные идентификаторы.

person Rap    schedule 30.12.2010

Платформа IMO Entity не имеет эквивалента генераторам NHibernate. Единственная функция, доступная в EF, - это StoreGeneratedPattern, для которой можно задать значение Identity. StoreGeneratedPattern просто означает, что DB назначит ключ, и ключ будет возвращен как часть операции вставки обратно в контекст EF (сложнее с Guids).

Если вы хотите иметь какой-то эквивалент генератора POID NHibernate, вам необходимо переопределить SaveChanges или обработать SavingChanges в вашем ObjectContext. Затем вы можете вручную назначить идентификатор всем вставленным объектам из алгоритма POID по вашему выбору, но вы должны реализовать алгоритм.

person Ladislav Mrnka    schedule 29.12.2010

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();
    }
}
person DR9885    schedule 16.09.2016