[SQL Server] EF, CreateIfNotExists и T-SQL
От: Olaf Россия  
Дата: 08.09.15 09:12
Оценка: 23 (2)
Добрый день, коллеги!

В рамках ответа на вопрос CreateDatabaseIfNotExists<> не хочет пересоздавать БД, решил посмотреть, каким образом EF проверяет наличие БД на сервере, т.е. к какому вызову T-SQL сводится вызов кода на C#
using (var db = new TestEntities())
{
    db.Database.CreateIfNotExists();
}

Для версий 4.0/5.0 все достаточно стандартно, код проверки на T-SQL выглядит следующим образом:
-- EF 4.0/5.0
SELECT Count(*) FROM sys.databases WHERE [name]=N'Test'

А вот для версии 6.0 реализация изменилась и теперь представляет собой запрос вида:
-- EF 6.0
IF db_id(N'Test') IS NOT NULL SELECT 1 ELSE SELECT Count(*) FROM sys.databases WHERE [name]=N'Test'

Посему у меня возник уже свой вопрос.
Для каких целей автор, в случае отсутствия БД делает дополнительное обращение к sys.databases для ее поиска, ведь функция db_id уже подтвердила отсутствие базы на сервере?

Более реалистичный вариант ответа заключается в неаккуратности реализации проверки в версии 6.0, т.е. автор, планируя изменить подход к анализу существования БД, выполнил работу наполовину. Я конечно могу заблуждаться и запрос все-таки несет какой-то скрытый смысл, но другие варианты ответа выглядят фантастическими – контроль работы db_id или с момента вызова db_id и до перехода к else БД была все-таки создана и т.п.

Самое простое решение, которое напрашивается в этой ситуации
IF db_id(N'Test') IS NOT NULL SELECT 1 ELSE SELECT 0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.