Это продолжение более раннего вопроса , который я разместил на ключах сущностей 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? Спасибо за вашу помощь.