2009-10-25 23 views
1

我使用LINQ来调用一个名为“GetTabMenuTheme”功能“DBO”数据库用户,我拖着它在数据库模型来生成这样的功能:调用在LINQ一个UDF不

[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 

有执行码L没有问题ocally(我的意思是连接:数据源=;初始目录= MyDB;集成安全= 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生成的SQL设计 和微软部分类 的 属性没有提供一种方法或 方法它不是那么容易在运行时更改它。

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

+0

我可以执行类似[MYUSER]功能[GetTabMenuTheme]但LINQ逼我执行DBO [GetTabMenuTheme] – 2009-10-25 11:46:49

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)); 
    } 
    
+0

我无法改变这种方式,因为我的模式是可变的。我的项目是一个CMS,数据库用户根据网站进行更改。 – 2009-10-25 11:48:36

+0

好的。我猜GetTabMenuTheme函数比所有用户都常见。在这种情况下,你应该把它放在两种环境中的一些“通用”模式中,让所有的用户访问这个“通用”模式。这应该可以解决你的问题。任何其他选项都会导致将此功能重复用于您拥有的每个模式(即针对每个用户) – AlexS 2009-10-25 12:02:23