Это продолжение более раннего вопроса, который я разместил о ключах сущностей EF4 с помощью SQL Compact. SQL Compact не позволяет создавать ключи идентификации, сгенерированные сервером, поэтому мне остается создавать собственные ключи по мере добавления объектов в файл 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()
, чтобы установить свойство ID, прежде чем я добавлю новый объект в свой ObjectContext
.
Вот мой вопрос: есть ли простой способ получить последний первичный ключ в хранилище данных из EF4 (без необходимости создания второго ObjectContext
для этой цели)? Любая другая причина не выбирать легкий путь и просто использовать GUID? Спасибо за вашу помощь.