2009-04-16 26 views
1

Entity Frameworkでアドホッククエリを使用して次のシーケンス番号を取得します。 私が使用している:Entity Frameworkを使用してDB2で次のシーケンス番号を取得する方法は?

LogEntities db = new LogEntities(); 

ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1"); 

を。これは、次のエラーが返されます。

ErrorDescription =「『SYSIBM.SYSDUMMY1は、』現在のスコープまたはコンテキストで解決することができませんでしたすべての参照変数であることを確認しますスコープ内で、必要なスキーマがロードされており、その名前空間が正しく参照されています。

これは、sysdummy1が私のモデルのマップされたテーブルではないからです。

LINQ 2エンティティコンテキストを使用してこのクエリを実行する方法を知っている人は誰ですか?

答えて

1

回答ありがとうございました。 自動増分ID列を使用できないのは、この特定の論理表が物理的に31個の別個の(日別の)表に分割されており、IDがすべての表にわたって一意である必要があるからです。

シーケンスから次の番号を取得し、それをEFモデルストアに追加するストアドプロシージャを作成しました。

private static long GetNextEventId(DbConnection dbConnection) 
{ 
    using (DbCommand cmd = dbConnection.CreateCommand()) 
    { 
     cmd.CommandText = "LogEntities.GetNextEventId"; 
     cmd.CommandType = CommandType.StoredProcedure; 

     // Execute the command 
     return Convert.ToInt64(cmd.ExecuteScalar()); 
    } 
} 

これは、スカラーを返すEFのストアドプロシージャを呼び出す別の方法です。

Using Stored Procedures That Return Non Entity Type

1

ObjectQueryは、「通常の」SQLではなく、Entity SQLを使用する必要があります。 「通常の」SQLを記述する場合は、ObjectQueryではなくストア接続を使用する必要があります。それは、なぜあなたが手作業でシーケンス番号を取得しているのだろうと思うのです。エンティティプロパティがサーバー上で自動インクリメントに設定されている場合、これはSaveChangesを実行すると自動的に取得されます。ストア接続を取得する必要がある場合、これを行うEntityConnectionタイプのメソッドCreateDbCommandがあります。再び、私はあなたがそれをしないことをお勧めします。この機能を使用すると、コードプロバイダ固有です。ほとんどのEntity Frameworkコードはプロバイダに依存しないコードでなければなりません。

0

別のオプションは、ID列を持つテーブルを作成し、挿入した後、アイデンティティVal関数から値を用いることであろう。

関連する問題