1

EntityFrameworkのアドホッククエリを介して次のシーケンス番号を取得したいと思います。私が使用しているもの:

LogEntities db = new LogEntities();

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

これにより、次のエラーが返されます。

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

これは、sysdummy1が私のモデルのマップされたテーブルではないためだと思います。

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

4

3 に答える 3

1

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

于 2009-04-16T12:28:18.700 に答える
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 で呼び出す別の方法を次に示します。

非エンティティ型を返すストアド プロシージャの使用

于 2009-04-17T07:37:28.957 に答える