在没有“dbo”数据库用户的情况下在 LINQ 中调用 UDF
Posted
技术标签:
【中文标题】在没有“dbo”数据库用户的情况下在 LINQ 中调用 UDF【英文标题】:Calling a UDF in LINQ without "dbo" database user 【发布时间】:2009-10-25 11:25:51 【问题描述】:我正在使用 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”,或者名称是 模棱两可。
【问题讨论】:
【参考方案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 选项。
【讨论】:
我可以执行类似 [MyUser].[GetTabMenuTheme] 的功能,但 LINQ 强制我执行 dbo.[GetTabMenuTheme]【参考方案2】:或者您可以使用 SqlMetal 构建地图文件并动态加载它。 在安装 CMS 之前,您可以运行一个工具来更改地图内表的模式名称。看看那里:http://www.techwave.it/blog/2010/01/28/linq-to-sql-modificare-dinamicamente-il-mapping-del-database-schema-2/
(虽然是意大利语,但是看代码就可以理解)
【讨论】:
【参考方案3】:我猜你的本地数据库和远程数据库有不同的默认架构。根据您的本地连接字符串,您正在使用默认架构设置为 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));
【讨论】:
我无法更改这种方式,因为我的架构是可变的。我的项目是一个数据库用户根据网站变化的CMS。 好的。我想 GetTabMenuTheme 功能对所有用户来说都是通用的。在这种情况下,您应该将它放在两个环境中的某个“通用”模式中,并让所有用户访问这个“通用”模式。这应该可以解决您的问题。任何其他选项都会导致将此功能复制到您拥有的每个架构(即每个用户)以上是关于在没有“dbo”数据库用户的情况下在 LINQ 中调用 UDF的主要内容,如果未能解决你的问题,请参考以下文章