1

これは、 SQL Compact を使用した EF4 エンティティ キーについて投稿した以前の質問のフォローアップです。SQL Compact ではサーバー生成の ID キーが許可されていないため、ObjectContext. 私の最初の選択は整数キーであり、以前の回答は、次の使用可能なキーを見つけるためにセレクター式で演算子を使用する拡張メソッドを示すブログ投稿にリンクされています。Max

public static TResult NextId<TSource, TResult>(this ObjectSet<TSource> table,  Expression<Func<TSource, TResult>> selector) 
    where TSource : class
{
    TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

    if (lastId is int)
    {
        lastId = (TResult)(object)(((int)(object)lastId) + 1);
    }

    return lastId;
}

拡張メソッドに関する私の見解は次のとおりですObjectContext。私が作業している にフィルター処理されていないエンティティ セットがある場合、正常に機能します。その場合、 にObjectContextはデータ テーブルのすべての行が含まれ、正確な結果が得られます。ただし、エンティティ セットがクエリ フィルターの結果である場合、メソッドはフィルター処理されたエンティティ セットの最後のエンティティ キーを返しますが、これは必ずしもデータ テーブルの最後のキーであるとは限りません。したがって、拡張メソッドは実際には機能しないと思います。

この時点で、エンティティ キーとして GUID を単純に使用することが明らかな解決策のようです。Guid.NewGuid()そうすれば、新しいエンティティを my に追加する前に、メソッドを呼び出して ID プロパティを設定するだけで済みますObjectContext

これが私の質問です: EF4 からデータ ストアの最後の主キーを取得する簡単な方法はありますObjectContextか (その目的で 2 番目の主キーを作成する必要はありません)。簡単な方法をとらず、単純に GUID を使用する理由は他にありますか? ご協力いただきありがとうございます。

4

4 に答える 4

3

最終的にGUIDを使用しました。

  • SQL Compact はローカルのシングル ユーザー システムであるため、サイズやパフォーマンスの問題は重要ではありません (または目立ちません)。アプリが航空券予約システムを管理するわけではありません。

  • 少なくとも現時点では、SQL Compact/EF4 スタックの "サーバー生成キーなし" の制限を回避する方法はないようです。誰かが巧妙なハックを持っていたとしても、私はそれを受け入れます。

これは、SQL Server または SQL Express で同じアプローチを取るという意味ではありません。私は今でも整数キーを明確に好みます。SQL Compact のより大きな兄弟は、EF4 と組み合わせてそれらを許可します。

于 2010-03-22T12:05:49.957 に答える
1

ガイドを使用します。AutoIncrement は、Entity Framework を使用する Compact Framework ではサポートされていません。

また、複数のデータ ソースを使用するアプリケーションを作成したい場合、int PK は非常に迅速に崩壊します。

  • Guid を使用すると、Guid.NewGuid() を呼び出すだけで新しいキーを取得できます。
  • int の場合、有効なキーを取得するにはデータベースにアクセスする必要があります。

データを複数のデータベースに保存すると、int PK によって競合が発生します。

于 2010-03-26T05:41:51.827 に答える
0

Guid を避ける理由の 1 つは、サイズ = メモリとストレージ スペースの消費です。

次のように SQL Compact メタデータをクエリすることもできます。

SELECT AUTOINC_NEXT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Categories' AND AUTOINC_NEXT IS NOT NULL

于 2010-03-21T11:19:00.667 に答える