Първо кодекс на рамката на обекта

Поради естеството на моята работа, често ми се налага да правя различни малки проекти, главно това са сайтове, написани в ASP.NET MVC. Всеки съвременен проект съдържа данни и следователно база данни, което означава, че трябва да работите по някакъв начин с него.
Освен всички дискусии относно плюсовете и минусите, бързам да ви уведомя, че изборът ми падна първо на Entity Framework Code. По време на разработването на проекта обръщам внимание единствено на бизнес логиката и не отделям време за проектиране на базата данни и други шаблонни действия. Неприятна изненада за мен, когато използвах този подход, беше невъзможността на Entity Framework да създаде индекс по полета, както и да използва удобна и модерна машина за търсене на пълен текст.
След многочасово гуглене, след като изпробвах десетки различни методи от StackOverflow и други подобни сайтове, стигнах до заключението, че няма очевидно и просто решение на проблема, затова реших да направя своя собствена, това ще бъде обсъдено допълнително.
Изпълнение
Основното изискване за решаване на проблема е лекотата на интегриране във всеки нов (съществуващ) проект. В Code First е обичайно да персонализирате всичко с атрибути, така че би било хубаво да направите това:
в същото време не бих искал да заменя DatabaseInitializer и да правя други нетривиални действия.
В работата си използвам Visual Studio 2013 Ultimate. Нека създадем нов проект от типа Библиотека на класове, незабавно добавете към него Entity Framework 6 Beta 1, като използвате конзолата NuGet (конзола на Package Manager):
PM> Инсталиране на пакет EntityFramework -Pre
Нека създадем атрибутите Index и FullTextSearch, както и изброяване за FullTextSearch:
Ако преди сте работили с пълнотекстово търсене, тогава вероятно сте разбрали защо имате нужда от Contains и FreeText, ако не, тогава тук.
След това нека създадем абстрактен клас, наследен от DbContext:
Като цяло, ако създадете модел сега, маркирате го с атрибути и стартирате проекта, индексите ще бъдат създадени успешно, но все пак се нуждаем от удобно използване на пълнотекстовия индекс, за това ще създадем клас на разширение: