2009-10-25 49 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