Вызов UDF в LINQ без пользователя базы данных "dbo" - PullRequest
1 голос
/ 25 октября 2009

Я использую LINQ для вызова функции с именем «GetTabMenuTheme», я перетащил ее в модель базы данных, чтобы сгенерировать такую ​​функцию:

[Function(Name="dbo.GetTabMenuTheme", IsComposable=true)]
public string GetTabMenuTheme([Parameter(DbType="NVarChar(MAX)")] string state)
{
    return ((string)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), state).ReturnValue));
}

и используйте его так:

from mi in db.ModuleInstances
select db.GetTabMenuTheme(mi.State)

и мое соединение:

Data Source=MyServer;Initial Catalog=MyDB;uid=MyUser;pwd=MyPassword

Нет проблем с выполнением кода локально (я имею в виду соединение: Источник данных =; Исходный каталог = MyDB; Интегрированная безопасность = Истина;), но при развертывании в сети выдается эта ошибка:

Невозможно найти ни столбец "dbo", ни пользовательская функция или агрегат "dbo.GetTabMenuTheme", или имя неоднозначный.

Ответы [ 3 ]

1 голос
/ 25 октября 2009

Отредактировано после комментария: вы можете вернуться к взаимодействию с базой данных не LINQ:

var com = db.Connection.CreateCommand();
com.CommandText = "select MyUser.GetTabMenuTheme(@state);";
com.Parameters.Add(new SqlParameter("@state", state));
var result = (string) com.ExecuteScalar();

Это позволяет вам выбрать схему, это MyUser в примере кода.

Я искал способ динамического изменения имени схемы LINQ, и это сообщение в блоге точно описывает его.

Ну, это не так просто, как кажется потому что имя таблицы хранится в атрибут частичного класса генерируется конструктором LINQ to SQL и Microsoft не предоставила способ или способ изменить его во время выполнения.

Затем блоггер описывает решение, в котором вы загружаете XML, определяющий схему во время выполнения. Это выглядит очень сложным и медленным; Я бы выбрал более простой вариант без LINQ.

0 голосов
/ 29 января 2010

Или вы можете создать файл карты с помощью SqlMetal и загрузить его динамически. Перед установкой CMS вы можете запустить инструмент, который меняет имя схемы таблиц внутри карты. Взгляните туда: http://www.techwave.it/blog/2010/01/28/linq-to-sql-modificare-dinamicamente-il-mapping-del-database-schema-2/

(по-итальянски, но вы можете понять, читая код)

0 голосов
/ 25 октября 2009

Я полагаю, у вас есть другая схема по умолчанию для вашей локальной базы данных и для удаленной. Согласно вашей локальной строке подключения, вы работаете под учетной записью локального администратора, для которой по умолчанию установлена ​​схема dbo. В то же время вы подключаетесь к своей удаленной базе данных с использованием аутентификации SQL Server, и (я думаю) схема по умолчанию для этого пользователя отличается от dbo. Вы должны либо:

  • изменить схему MyUser по умолчанию на dbo (если вы уверены, что развернули свою функцию в схеме dbo)
  • изменить схему назначения в вашей локальной базе данных (так же, как на вашем «производственном» сервере). Эта опция будет включать в себя изменение вашей (локальной) процедуры развертывания немного + изменение определения функции в вашей модели (пример следует)

    ([Function(Name="YourSchemaNameHere.GetTabMenuTheme", IsComposable=true)]
    public string GetTabMenuTheme([Parameter(DbType="NVarChar(MAX)")] string state)
    {
        return ((string)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), state).ReturnValue));
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...