Identity 2.0 String或Int主键?

时间:2014-07-24 00:54:35

标签: c# asp.net-identity

我将为我们的退出和新应用程序创建一个新的授权DLL。 我们希望为POCO类,OAuth和声明添加Identity 2.0主要功能。 (声明非常重要)

因此,首先要记住的是主键是一个字符串。我知道这可以改变但我首先研究了为什么它是一个字符串,我发现这个SO答案: Why do the ASP.NET Identity interfaces use strings for primary and foreign keys?他们在哪里明确指出字符串更好'为了避免投射,因为声明确实使用字符串。

我们当前的所有应用程序都使用Int作为主键(自动增量)。

而不是盲目地改变Identity实现以使用int我研究了更多,并且在同一个SO答案中建议的一个解决方案是具有ID的字符串表示。

类似的东西:

[Index(IsClustered = false)]
string Id
[Index(IsClustered = true)]
int LogicalId

我不确定群集索引是什么,但是以某种方式读取它是如何排列在物理磁盘中的,所以它是关于性能的,所以我会按原样使用它确定。

我的问题是:

MAIN :此方案的最佳做法/建议是什么?

  • a)拥有LogicalId int,
  • b)用int
  • 覆盖Identity的默认实现
  • c)将所有int转换为字符串(作为guid)
在LogicalId(a)的情况下

如果我们无法将PK作为字符串使用,那么这样做的目的是什么?当SaveChanges数据库中的新实体时,我应该如何增加LogicalId? EF会自动为我做这件事吗?

如果使用TKey作为int覆盖标识实现:(b)

索赔的用户ID(我猜)总是字符串。如果我们为用户使用多个外部提供商,那会有关系吗? 是否可以为Int创建EntityFramework的具体实现?有人已经做过吗?

Uninstall-Package Indentity.EntityFramework
Install-Package Identity.EntityFrameworkInt

那会很好:D

将所有数据转换为字符串(c)

与GUID一起工作是不是很痛苦?那些使用GUID的人你是否还有另一个更简单的'公众使用的标识符? 无法停止对客户服务进行成像:

  

我在记录中找不到您的用户,请提供您的用户ID?

哎哟

  

当我点击50个{类似产品}

中的一个时,网站无效      

- 产品ID是什么?

洛尔

  

我们有两个产品相同,请删除一个。

     

- 当然,给我产品ID

CUAC

1 个答案:

答案 0 :(得分:1)

我不会将相关问题视为暗示他们更好。 string并不是更好,它只是与众不同。我读它的原因是字符串可以保存整数,指针和任何东西。如果他们选择使用int,则会遇到int

正如您所观察到的,在身份2.0中添加了TKey以允许使用不同类型的密钥,并且选择不同类型的密钥并不会违反最佳做法" (虽然你应该选择传统的东西)。

无论何时打算保存新实体,都不要将其设置为自动递增标识,只需使用代码生成新的guid即可。那里没有任何痛苦。

您不应该遇到性能问题,除非您正在开发一些同时为您的数据库提供服务的东西。

就个人而言,我选择ints,因为我有一个处理所有内容的中央数据库,我喜欢简单的整数guid。虽然如果我正在开发某种具有并发DB的系统,我会选择Guids。

字符串仍然提供身份中任何其他键类型的一件事是扩展名User.Identity.GetUserId()仍然返回一个字符串,所以即使在覆盖TKey之后你也必须强制转换它。希望有时会修复。

相关阅读:GUID vs INT

相关问题