Entity Framework 7 + Redis

Microsoft таки вирішили додати в свій флагманський orm підтримку не реляційних сховищ даних.
Особисто я дізнався про це на teched europe 2014 (хтось, можливо, знав і раніше).
У EF7 заявлена підтримка Redis і Azure Table Store.
image image


Table Store для тих, хто Azure не користується, не цікавий в принципі.
А ось підтримка Redis — інша справа, т. к. in memory key-value store, яке можна тримати на своїх серверах — це вже цікаво.


Все що написано нижче, відноситься до поточного стану код, який далекий від завершення. Цитата EF wiki:
"As you try out EF7 please bear in mind that this is a very early stage in the development of the new EF codebase and there are many features that are partially or not implemented yet available."

Взагалі про EF7

EF7 використовує (на 10 листопада 2014 року) бібліотеку роботи з Redis від StackExchange доступною на nuget.org
Це приємно, що MS не став писати свою власну бібліотеку, хоча вони і могли це зробити.
Поки EF7 не доступний в nuget (на 10 листопада 2014 року), але на github вже можна дивитися
(Відео з teched europe показували ef7-pre, але на загальному nuget його поки немає.)

EF7 пишеться відразу, щоб працювати з VS2014(в vs2013 update2 теж працює), з asp.net vnext (json файли з залежностями) і т. д.
У мене не вийшло скомпілювати проект ні на vs2013, ні vs2014 т. к. не вистачало частини залежностей спочатку, а потім вилетіла помилка описана тут до мене. Щоб зібрати проект, потрібно прочитати інструкцію , але мені поки що це не допомогло.

В EF з'явиться Fluent Api, яке специфічно для провайдера (для Relation або для Azure Table Store). Напевно, і для Redis що-тоспецифичное з'явиться, але про це інформації в wiki немає.

На Teched Europe говорилося, що EF7 стане більш розширюваним. Я не знаю, що було первинним: «розширюваність» або «підтримка key-value store», але останній без першого все одно не можливо. Т. к. Генератор sql в redis точно не потрібен, наприклад, як і міграції від code first.

Що можна сказати про Redis зараз:

На EF Wiki є стаття "EF7 Redis provider" у якої є хоч якась інформація про роботу з Redis, обмеження по роботі з ним.

Нових функцій/методів/api для Redis вчити особливо не доведеться, якщо Ви раніше з EF вже працювали.
Код виглядає приблизно так:

Створюємо контекст, вибираємо з нього типізований DbSet.
Працюючи з DbSet, можемо робити все CRUD операції.
image

Redis також підтримуються не тільки синхронні, але і асинхронні версії методів.image

DbSet (Реалізує IQuariable) так само можна отримати всі потрібні нам вибірки, агрегації і т. д. (правда, реалізовані вони, ясна річ, відмінно, від sql версії.)image

Що найприємніше — багато тести, загальні для Redis версії SQL server.
Наприклад, тест на відключення ChangeTrackingManager
(спосіб прискорити роботу, якщо нам не потрібно відслідковувати зміни в об'єктах).image

Із запитами з фільтрацією(where) даних треба бути дуже акуратними.
Коли ми будемо шукати щось по ключу — все просто, вибірка по ключу швидка операція. Коли робиться умова where то в реляційну базу вирушав запит і where проводилася на базі даних. В бд могли бути індекси і можна було отримати швидкий результат, навіть на великому обсязі даних. У випадки Redis, буде сканування всіх значень, без будь-яких індексів. Думаю на клієнт виноситися це не буде, але пошук сканування всіх даних, однозначно повільніше пошуку за індексом.

Чого немає і не буде?

В EF можна було викликати Include, щоб завантажити NavigationPropery. На базі при цьому робився join таблиці зовнішнього ключа.
випадки Key-Value store ніяких navigation property бути не може, оскільки relations відсутні в key-value store і немає ні какогот join.image

Database/Model First підходу теж не повинно бути.
  • З InMemory Store витягнути модель даних і згенерувати на основі класи не можливо. Кожна база даних має тільки номер, а не назва. База даних — це не набір таблиць, таблиць не існує. Питання як при цьому отримати якісь строготипизированные сутності моделі Database First? Відповідь — тільки дуже дивними і не зрозумілими способами.
  • Model First ?- Model First може і хороша ідея, але базу з неї у нашому випадки не сгенерируешь, а малювати модель, яку можна просто описати в коді досить трудомістке. Та й хто її насправді використав?


Цікаві питання:

В EF можна через context на пряму викликати хранимку або довільний sql-код виконати на mssql server.
У Redis вбудований скриптова рушій Lua, хочеться зрозуміти можна його через EF використовувати.
Чи можна на пряму буде викликати команди, якщо ми зрозуміємо, що генерується EF запит не такий, як повинен бути.
Напевно є випадки, коли виклик коду Lua через EF був би розумний, як і команд на пряму. В поточних документах є інформація з цього приводу, але дуже розмито у розділі Query Sorting
«You can also use the same command to store the result in another data structure that a LUA script could then analyze.»

Що б хотілося дізнатися:

Особисто мені хотілося б дізнатися 2 основні речі:
  • Наскільки % EF версія повільніше, ніж звичайна StackExchange версія. Зрозуміло, що питання складний і залежить від багатьох факторів, але хоч якісь цифри побачити б.
  • Наскільки стабільно працює з кластерної конфігурацією? Оскільки саме робота кластера таких серверів і цікавить.
Навряд чи ми дізнаємося найближчим часом, бо до виходу EF ще чимало часу. Поки на nuget немає версій навіть пакетів від ef7, а раніше перед релізом завжди з'являлися всякі alpha,beta,rc.
Так і в записках архітектурних комітетів теж не зрозуміло

Висновки: будемо уважно стежити за успіхами команди EntityFramework. Може, коли-небудь з'явиться можливість і інші nosql бази використовувати.

P. S.
У команді EF Іванов Іван Іванович не користується повагою.
В якості імен використовується персонажі з my little ponny...image
image

Вихідний текст статті на github

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.