Я почти уверен, что могу рассказать вам, что происходит, но я не знаю, есть ли решение для этого.
Я думаю, проблема в том, что символ ':' используется NHibernate для создания именованного параметра. Ваше выражение меняется на:
set nocount on;update myusers set geo=geography@p0({0}, {1}, 4326) where userid={2};
И @ p0 будет переменной SQL. К сожалению, я не могу найти никакой документации по экранированию двоеточий, поэтому они не рассматриваются как именованные параметры.
Если существует escape-символ (мой быстрый просмотр источника NHibernate не нашел его; Именованные параметры обрабатываются в NHibernate.Engine.Query.ParameterParser, если вы хотите потратить немного больше времени на поиск), тогда вы можете использовать что.
Другие решения:
- Добавить escape-символ к источнику. Затем вы можете использовать модифицированную версию NHibernate. Если вы сделаете это, вы должны представить свой патч команде, чтобы он мог быть включен в реальную вещь, и вам не нужно поддерживать измененную версию исходного кода (без удовольствия).
- Создайте пользовательскую функцию в вашей БД, которая возвращает geography :: Point, а затем вызовите вашу функцию вместо стандартной функции SQL. Это кажется самым быстрым / простым способом начать работу, но при этом ощущается как пластырь.
- Посмотрите, есть ли в NHibernate Spatial что-то, что позволит вам программно добавить geography :: Point () [или отредактировать код для этого проекта, чтобы добавить его и отправить патч этой команде].