在没有“dbo”数据库用户的情况下在LINQ中调用UDF

时间:2009-10-25 11:25:51

标签: asp.net sql-server linq function user-defined-functions

我正在使用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 个答案:

答案 0 :(得分:1)

评论后编辑:您可以回退到非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模式名称的方法,而this blog post则完全描述了它。

  

嗯,它不像接缝那么容易   因为表名存储在一个   部分类的属性   由LINQ to SQL设计器生成   和微软没有提供方式或   在运行时更改它的方法。

然后,博主描述了一种解决方案,您可以在运行时加载指定架构的XML。它看起来非常复杂和缓慢;我会选择更简单的非LINQ选项。

答案 1 :(得分:0)

我猜你的本地数据库和远程数据库有不同的默认架构。根据您的本地连接字符串,您在本地管理员帐户下工作,该帐户的默认架构设置为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));
    }
    

答案 2 :(得分:0)

或者您可以使用SqlMetal构建一个映射文件并以dinamically方式加载它。 在安装CMS之前,您可以运行一个工具来更改映射中表的模式名称。看看那里:http://www.techwave.it/blog/2010/01/28/linq-to-sql-modificare-dinamicamente-il-mapping-del-database-schema-2/

(这是意大利语,但你可以理解阅读代码)