在没有“dbo”数据库用户的情况下在 LINQ 中调用 UDF
-
06-07-2019 - |
题
我正在使用 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
在本地执行代码没有问题(我的意思是连接:Data Source=.;Initial Catalog=MyDB;Integrated Security=True;),但是当我在 web 中部署时,会产生此错误:
找不到列“ DBO”或用户定义的函数或汇总的“ dbo.getTabMenutheme”,否则名称是模棱两可的。
解决方案
评论后编辑:您可以回退到非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设计器生成 而微软并没有提供一种方法或 在运行时更改它的方法。
然后,博主描述了一种解决方案,您可以在运行时加载指定架构的XML。它看起来非常复杂和缓慢;我会选择更简单的非LINQ选项。
其他提示
或者您可以使用SqlMetal构建一个映射文件并以dinamically方式加载它。 在安装CMS之前,您可以运行一个工具来更改映射中表的模式名称。看看那里: http://www.techwave.it/blog/2010/01/28/linq-to-sql-modificare-dinamicamente-il-mapping-del-database-schema-2/ 一>
(这是意大利语,但你可以理解阅读代码)
我猜你的本地数据库和远程数据库有不同的默认架构。根据您的本地连接字符串,您正在本地管理员帐户下工作,该帐户的默认架构设置为 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)); }