2016-02-28 83 views
0

這是一個錯誤?如何從Entity Framework 6(數據庫優先)和Npgsql執行存儲過程?

我的組成部分是:

  1. .NET 4.6.1
  2. 實體框架6.0
  3. 3.0.5 Npgsql的
  4. 的PostgreSQL 9.5

首先,我創建了一個表,存儲過程PostgreSQL 9.5中

CREATE TABLE hello 
(
    msg text 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE hello 
    OWNER TO postgres; 

CREATE OR REPLACE FUNCTION sayhello() 
    RETURNS SETOF hello AS 
$BODY$ 

select 
* 
from version() 

    $BODY$ 
    LANGUAGE sql VOLATILE 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION sayhello() 
    OWNER TO postgres; 

二,我去.edmx文件(實體框架6.0),選擇「從數據庫更新」,選擇新表「hello」和新存儲過程「sayhello」。

模型瀏覽器現在顯示新的表格實體和導入的函數。

三,添加一個新的程序的WCF文件:

public string SayHello() 
{ 
      using (var ctx = new chaosEntities()) 
      { 
       var x = ctx.sayhello(); 
       return "Hello"; 
      } 
} 

將WCF服務作爲啓動項目,並開始調試。

WCF測試客戶端出現。從WCF服務執行SayHello()導致:

public virtual ObjectResult<hello> sayhello() 
{ 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<hello>("sayhello"); 
} 

當這樣執行,我得到:

類型的異常 'System.Data.Entity.Core.EntityCommandCompilationException' 發生的EntityFramework。 dll但未在用戶代碼中處理

附加信息:準備命令 定義時發生錯誤。詳情請參閱內部例外。

內部異常是:{「值沒有在預期範圍之內。」}

正如我有幾百存儲過程,就如何解決這一問題的最欣賞的任何幫助。

TIA

注:我懷疑問題是NpgsqlServices.TranslateCommandTree,但我只是猜測。

回答

1

我永遠無法按照我希望的方式工作(通過EntityFramework),所以我最終這樣做了。我肯定會開放更好的解決方案!

下面的代碼直接調用Npgsql來避免整個EntityFramework事物。

public string SayHello() 
     { 
      using (var ctx = new chaosEntities()) 
      { 
       var b = ctx.Database.Connection.ConnectionString; 

       using (var conn = new Npgsql.NpgsqlConnection(connectionString: b)) 
       { 
        conn.Open(); 
        using (var tran = conn.BeginTransaction()) 
        using (var command = conn.CreateCommand()) 
        { 
         command.CommandText = "sayhello"; 
         command.CommandType = CommandType.StoredProcedure; 

         var g = (string)command.ExecuteScalar(); 
         return g; 
        } 
       } 
      } 
     } 
相關問題