Entity framework 使用SQL Compact/EF4的GUID或int实体键?
这是我用SQLCompact发布的EF4实体键的后续内容。SQL Compact不允许服务器生成标识键,因此我只能在对象添加到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&
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中创建多线程记录,这一点很好。我实际上考虑过这种方法,这是一个很好的解决方案