これは、 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 を使用する理由は他にありますか? ご協力いただきありがとうございます。