2014-07-24 53 views
2

我将为我们的退出和新应用程序创建一个新的授权DLL。 我们希望为POCO类,OAuth和声明添加Identity 2.0主要功能。 (索赔真的很重要)标识2.0字符串或Int主键?

因此,首先想到的是主键是一个字符串。我知道这可以改变,但我也第一次研究为什么它是一个字符串,我发现这个答案: Why do the ASP.NET Identity interfaces use strings for primary and foreign keys?他们cleary指定该字符串'更好',以避免铸造,因为索赔确实使用字符串。

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

而不是盲目的和改变身份实现使用int我研究了更多,同一个答案建议一个解决方案是有一个字符串表示的ID。

喜欢的东西:

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

我不知道什么是聚簇索引,但阅读它在某种程度上行是如何排列的物理磁盘,所以它是关于性能的,所以我会去用它作为正常。

我的问题是:

主要:什么是这种情况的最佳做法/建议吗?

  • a)具有LogicalId INT,
  • B)覆盖认同与诠释
  • c中的默认实现),所有的INT转换为字符串(如GUID)

的情况下, LogicalId(a):

如果我们无法将PK用作字符串,那么这样做的目的是什么?如何在SaveChanges数据库上的新实体时增加LogicalId? EF会自动为我做到这一点?

与TKEY的作为INT倍率身份实现的情况下:(b)中

使用者ID上权利要求是:(i猜)总是字符串。如果我们为我们的用户使用多个外部提供商,那会很重要吗 是否可以创建EntityFramework for Int的具体实现?任何人都已经?

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

那将是很好:d

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

是不是疼痛GUID来工作吗?那些使用GUID的人你还有另一个更简单的标识符供公众使用吗? 无法停止映像客户服务:

我无法在我们的记录中找到您的用户,您能否提供您的用户ID?

哎哟

网站无法正常工作,当我点击50 {同类产品}

之一 - 什么是产品编号?

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

- 当然,给我的产品ID

CUAC

回答

1

我不看链接的问题,因为这意味着他们是更好的。 string不是更好,它只是不同而已。我读它的原因是,字符串可以保存整数,指导和任何东西。如果他们选择使用int,那么他们被卡在int

正如您所观察到的,Identity 2.0中添加了TKey以允许使用不同类型的密钥,并且选择不同类型的密钥不会“违背最佳实践”(尽管您应该选择传统方式)。

每当你打算保存一个新的实体时,你都不会将它设置为一个自动递增的身份,只是使用代码来生成一个新的GUID。那里没有任何痛苦。

除非您正在开发一些服务于大量用户的功能,否则您不应该遇到性能问题,所有这些都会触发您的数据库。

就我个人而言,我选择ints,因为我有一个中央数据库处理所有事情,我喜欢简单的ints over guids。尽管如果我正在开发某种带有并发数据库的系统,我会选择Guids。

字符串仍然通过任何其他密钥类型提供身份的一件事是,User.Identity.GetUserId()的扩展名仍然会返回一个字符串,因此即使在覆盖TKey之后,您也必须进行强制转换。希望这会在某个时候被修复。

相关阅读:GUID vs INT

+0

+1固定User.Identity.GetUserId() –

+0

我知道这是一个老问题,但会下降的问题,但对于这种情况。当数据库通过身份,自动增量列创建你的Id时,你有没有解决过这个问题?在注册我的用户得到保存到数据库,但在IdentityUser实例Id保持0(默认值为int),因为usermanager不读取数据库新创建的ID。任何帮助将不胜感激。谢谢! –

+0

@deezg我还没有听说过这个问题。你可能有更好的运气开个问题 – Shoe