Entity framework 使用SQL Compact/EF4的GUID或int实体键?

Entity framework 使用SQL Compact/EF4的GUID或int实体键?,entity-framework,primary-key,sql-server-ce,entity-framework-4,Entity Framework,Primary Key,Sql Server Ce,Entity Framework 4,这是我用SQLCompact发布的EF4实体键的后续内容。SQL Compact不允许服务器生成标识键,因此我只能在对象添加到ObjectContext时创建自己的键。我的第一个选择是整数键,前面的答案链接到一个,显示了一个扩展方法,该方法使用带有选择器表达式的Max运算符来查找下一个可用键: public static TResult NextId<TSource, TResult>(this ObjectSet<TSource> table, Expression&

这是我用SQLCompact发布的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;
}
publicstatictresult NextId(此对象集表,表达式选择器)
where TSource:class
{
TResult lastId=table.Any()?table.Max(选择器):默认值(TResult);
if(lastId为int)
{
lastId=(TResult)(object)((int)(object)lastId)+1;
}
返回lastId;
}
下面是我对扩展方法的看法:如果我正在使用的
ObjectContext
具有未过滤的实体集,那么它就可以正常工作。在这种情况下,
ObjectContext
将包含数据表中的所有行,我将得到准确的结果。但是,如果实体集是查询筛选的结果,则该方法将返回筛选实体集中的最后一个实体键,该键不一定是数据表中的最后一个键。因此,我认为扩展方法不会真正起作用

在这一点上,显而易见的解决方案似乎是简单地使用GUID作为实体键。这样,我只需要调用
Guid.NewGuid()
方法来设置ID属性,然后再将新实体添加到我的
ObjectContext


我的问题是:有没有一种简单的方法可以从EF4获取数据存储中的最后一个主键(而不必为此创建第二个
ObjectContext
)?有没有其他理由不采取简单的方法,只使用GUID?感谢您的帮助。

避免使用guid的一个原因是大小=内存和存储空间消耗

您还可以查询SQL Compact元数据,如下所示:

从INFORMATION\u SCHEMA.COLUMNS中选择AUTOINC\u NEXT
如果TABLE_NAME='Categories'和AUTOINC_NEXT不为NULL,那么避免使用guid的一个原因是size=内存和存储空间消耗

您还可以查询SQL Compact元数据,如下所示:

从INFORMATION\u SCHEMA.COLUMNS中选择AUTOINC\u NEXT
其中TABLE_NAME='Categories'和AUTOINC_NEXT不为空

我最后使用了一个GUID

  • 尺寸/性能问题并不重要 SQL Compact非常关键(甚至值得注意),因为 这是一个本地单用户系统。 它不像应用程序那样 管理航空公司预订 系统

  • 至少在这一点上 似乎没有办法绕过“不” “服务器生成的密钥”的限制 SQL Compact/EF4堆栈。如果有人有一个聪明的黑客,我仍然愿意接受


这并不意味着我会在SQL Server或SQL Express中采用相同的方法。我仍然对整数键有明确的偏好,SQL Compact的较大同级允许它们与EF4结合使用。

我最终选择了GUID

  • 尺寸/性能问题并不重要 SQL Compact非常关键(甚至值得注意),因为 这是一个本地单用户系统。 它不像应用程序那样 管理航空公司预订 系统

  • 至少在这一点上 似乎没有办法绕过“不” “服务器生成的密钥”的限制 SQL Compact/EF4堆栈。如果有人有一个聪明的黑客,我仍然愿意接受


这并不意味着我会在SQL Server或SQL Express中采用相同的方法。我仍然对整数键有明确的偏好,SQL Compact的较大同级允许它们与EF4结合使用。

使用Guid。带有实体框架的精简框架不支持自动增量

另外,如果您想要创建一个使用多个数据源的应用程序,int-PK将很快崩溃

  • 使用Guid,您可以通过调用Guid.NewGuid()来获取新密钥
  • 对于int,您必须点击数据库才能获得有效的密钥

如果在多个数据库中存储数据,int PK将导致冲突。

使用Guid。带有实体框架的精简框架不支持自动增量

另外,如果您想要创建一个使用多个数据源的应用程序,int-PK将很快崩溃

  • 使用Guid,您可以通过调用Guid.NewGuid()来获取新密钥
  • 对于int,您必须点击数据库才能获得有效的密钥

如果将数据存储在多个数据库中,int-PK将导致冲突。

我以前对SQL CE所做的工作(我假设有一个应用程序访问数据库)是在启动时计算最大值并将其放入静态变量中。现在,您可以轻松地分发顺序值,并且可以使代码非常容易地以线程安全的方式生成这些值。

我以前为SQL CE所做的工作(我假设有一个应用程序访问数据库),就是在启动时计算最大值,并将其放入静态变量中。现在,您可以轻松地分发顺序值,并且可以使生成这些值的代码非常容易地实现线程安全。

我将如何使用EF4执行该查询?我将如何使用EF4执行该查询?您展示的方法看起来根本不具有线程安全性!如何阻止两个线程获得相同的ID?这对我来说不是问题——我只对单用户应用程序使用SQL CE,并且只在单个线程上生成记录。不过,如果有人想在SQLCE中创建多线程记录,这一点很好。您展示的方法看起来根本不是线程安全的!如何阻止两个线程获得相同的ID?这对我来说不是问题——我只对单用户应用程序使用SQL CE,并且只在单个线程上生成记录。不过,如果有人想在SQLCE中创建多线程记录,这一点很好。我实际上考虑过这种方法,这是一个很好的解决方案