我将为我们的退出和新应用程序创建一个新的授权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 :此方案的最佳做法/建议是什么?
:
如果我们无法将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
答案 0 :(得分:1)
我不会将相关问题视为暗示他们更好。 string
并不是更好,它只是与众不同。我读它的原因是字符串可以保存整数,指针和任何东西。如果他们选择使用int
,则会遇到int
。
正如您所观察到的,在身份2.0中添加了TKey
以允许使用不同类型的密钥,并且选择不同类型的密钥并不会违反最佳做法" (虽然你应该选择传统的东西)。
无论何时打算保存新实体,都不要将其设置为自动递增标识,只需使用代码生成新的guid即可。那里没有任何痛苦。
您不应该遇到性能问题,除非您正在开发一些同时为您的数据库提供服务的东西。
就个人而言,我选择ints
,因为我有一个处理所有内容的中央数据库,我喜欢简单的整数guid。虽然如果我正在开发某种具有并发DB的系统,我会选择Guids。
字符串仍然提供身份中任何其他键类型的一件事是扩展名User.Identity.GetUserId()
仍然返回一个字符串,所以即使在覆盖TKey
之后你也必须强制转换它。希望有时会修复。
相关阅读:GUID vs INT