这是我在使用 SQL Compact 的 EF4 实体键上发布的一个较早问题的后续内容。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?谢谢你的帮助。