这是我的第一个MVC / Linq to SQL应用程序。我正在使用现成的带有ASP.NET的SQL Membership来通过我的系统跟踪用户。
正如大多数人所知,UserId是一个guid,很棒。但是,为了链接系统中其他用户创建的表,我决定使用username而不是userid。我之所以这样做是因为:
例如:我不必根据用户名查看用户标识来创建新故事;我只是将User.Identity.Name插入故事表。
现在我遇到了一些令人讨厌的并发症,这似乎与此有关。它在我的本地计算机上工作正常,但在主机上却没有。我不断得到一个类似这样的错误:
“System.InvalidCastException:指定的强制转换无效。在System.Data.Linq.IdentityManager.StandardIdentityManager.SingleKeyManager”...
只要在主机上发生数据库插入,就会发生这种情况。如果我理解正确,这是当你将非整数字段(在我的情况下是用户名)链接到非整数字段的另一个表(aspnet_user中的用户名)时发生的错误。虽然报告的错误看起来有点不同,但它们可能相似吗?
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358
在任何情况下,MS错误与否 - 在我的表中存储用户名而不是用户ID是一个坏主意?如果是,为什么?
更新
我只想在这里添加更多上下文。人们提出的一个好处是,如果我想允许用户将来更改其用户名,这是危险的。完全有效!
但是,此应用程序在很大程度上依赖于用户名。每个用户创建一个且只有一个故事。然后,他们使用:mysite / username链接到他们的故事。因此,应用程序永远不会允许他们更改用户名。对于那些关注链接的人来说,只会看到它不再存在,这会造成潜在的噩梦。
答案 0 :(得分:1)
我使用了与你相同的方法并且它有效。您的应用程序表与成员资格数据库中的表之间是否存在关系?如果是这样,您可能希望删除该关系。
答案 1 :(得分:1)
我唯一的想法是为了将来证明您的应用程序,用户ID将提供用户更改其用户名的灵活性,因为用户ID将保持不变(例如SO)。 但这必须符合您的应用要求。然后,需求通常会随着开发人员的控制而改变。
答案 2 :(得分:1)
请注意,您对用户名的评论是唯一的。 Anita Takeabath与Seymour Butts结婚的那一刻突然之间的禁区想要成为对手。
只是一个想法!
答案 3 :(得分:0)
由于以下原因,这很糟糕:
您提到避免额外的数据库调用。但是,通过连接表,没有对数据库的“额外”调用。你可以说加入比没有加入更昂贵。但是,很可能,商店需要的用户信息多于用户登录名(注意:用户名不是唯一的,用户登录名是唯一的)。因此,无论如何您都需要加入大多数数据库操作。
用户登录名的长度不同,在加入时使用效果不佳。
编辑:修改后的格式。我还在学习如何使我的帖子看起来更好: - )
答案 4 :(得分:0)
如果您实现此目的的原因是为了更方便地访问用户的GUID,我建议让您的FormsAuthentication.SetAuthCookie使用用户的GUID作为名称属性,并在整个应用程序中使用User.Identity.Name。
使用用户名作为唯一标识符可能会在将来产生不良后果。如果您希望将来允许用户更改其用户名,您将很难实现该用户名。