我想使用System.Guid类型作为我在asp.net web api应用程序中的所有表的id。但我也使用Asp.net标识,它使用字符串 -type id(也用于存储guid)。所以我想知道为什么它使用字符串 id而不是System.Guid默认情况下?什么是更好的选择通过所有的应用程序使用 - Guid id或字符串-guid id?在使用字符串的情况下 - 在代码或数据库中生成新的id的最合适和最可靠的方法是什么?为什么asp.net标识用户标识是字符串?
回答
取决于您使用的是哪种版本的ASP.Net身份验证,数据库上的ASP.NET Identity v2应将其存储为AspNetUsers
表中的唯一标识符(Guid)。在更多的前面版本中,它将在webpages_Membership
表中将用户标识存储为int。
我相信它将它表现为一个字符串,因此它可以是任何您喜欢的数据类型,然后可以根据需要在代码中进行转换。
您好,我正在使用最新版本的ASP.NET成员资格系统 - ASP.NET身份。我仍然不确定,对数据库中的所有表使用字符串的最佳做法是什么?或者将所有内容都转换为GUID? – Ostap
@ user3460585 int vs Guids是古老的论点。看到这些答案:http://dba.stackexchange.com/a/266/6868 http://blog.codinghorror.com/primary-keys-ids-versus-guids/ http://programmers.stackexchange.com/a/189031/86760 – trailmax
对不起,我没有意识到你在问你的数据库。通常我们所做的就是将用户名记录存储在我们的数据库中的用户记录中,然后我们可以引用ASP.Net记录,同时也将您从基础成员层中分离出来。 – Tim
使用ASP.NET Core,您可以使用一种非常简单的方式来指定Identity的模型所需的数据类型。
第一步,超越身份等级从<字符串>到<数据键入要>:
public class ApplicationUser : IdentityUser<Guid>
{
}
public class ApplicationRole : IdentityRole<Guid>
{
}
声明你的数据库环境,使用类和数据输入你想要的:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
}
而在您的启动类中,使用您的模型声明身份服务并声明您想要的数据类型ary键:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext, Guid>()
.AddDefaultTokenProviders();
有关信息,现在官方文档中有一个主题:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-primary-key-configuration – AdrienTorris
- 1. org.hibernate.NonUniqueObjectException - hibernate认为是什么标识符
- 2. iPhone - 什么是重用标识符(UITableViewCell)?
- 3. 标识符不能为空字符串
- 4. 预期标识符?什么?
- 5. asp.net公共字符串不是一个有效的标识符
- 6. 需要标识符是什么意思?
- 7. XACML标识符是什么意思?
- 8. 什么是Dreamweaver的包标识符?
- 9. 为什么GETDATE()无效的标识符
- 10. 为什么DllImport需要标识符?
- 11. 标识中的字符标识
- 12. 为什么字符串标识符通常是一个设定的长度?
- 13. Twilio调用者标识和Asp.Net标识
- 14. 什么是'多部分标识符',为什么不能绑定?
- 15. PayPal用户标识符
- 16. 依靠Facebook用户标识作为永久性用户标识
- 17. ASP.NET为什么接受外部创建的会话标识符?
- 18. 语法错误:标识符'字符串'
- 19. 标识符后分割C字符串
- 20. 制作C标识符和字符串?
- 21. 标识符“字符串”未定义?
- 22. 拆分标识符字符串python
- 23. 字符串未声明的标识符
- 24. ASP.NET会话标识符
- 25. 为什么在UITableViewCell标识符中使用static关键字?
- 26. 为什么我不能在我的程序申报的字符串:“字符串是未声明的标识符”
- 27. 为什么字符串[]被识别为只是一个字符串
- 28. 为什么CREATE TABLE中的一个标识符是双引号的,但不是其他标识符?
- 29. MembershipProvider用户标识
- 30. 标识2.0字符串或Int主键?
“为什么”解释[这里](http://stackoverflow.com/q/19238621/304683) - 在这篇文章中的答案将真正帮助。心连心。 – EdSF
感谢@EdSF,但是我仍然对组织应用程序的最佳方式是什么 - string-guids或guids(uniqueidentifier)的id? – Ostap
这取决于你的要求。请参阅[Rick Anderson(MSFT)的答案](http://stackoverflow.com/a/24152085/304683)以获取指导。 – EdSF