Это продолжение по сравнению с earlier question Я разместил на EF4 сущности с SQL Compact. SQL Compact не позволяет создавать серверные ключи идентификации, поэтому мне остается создавать собственные ключи, поскольку объекты добавляются к ObjectContext
. Мой первый выбор был бы целочисленный ключ, и предыдущий ответ связан с blog post, который показывает метод расширения, который использует оператор Max
с выражением селектора, чтобы найти следующий доступный ключ:GUID или int entity key с SQL Compact/EF4?
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? Спасибо за вашу помощь.
Подход, который вы показываете, не выглядит нитей безопасным вообще! Что остановить два потока от получения одинакового идентификатора? –
Не проблема для меня - я использую только SQL CE для однопользовательских приложений, и я только создаю записи в одном потоке. Однако, если кто-то хочет создать многопоточную запись в SQL CE. –