2009-10-09 238 views
1

这是我第一个MVC/Linq to SQL应用程序。我使用开箱即用的ASP.NET成员来跟踪用户通过我的系统。我该怎么办?

大家都知道,UserId是一个guid,很棒。但是,为了链接系统中的其他用户创建的表,我决定使用用户名而不是用户名。我这样做的原因是因为:

  1. 用户名是唯一反正
  2. 它阻止我不必处理DB函数时作出额外的呼叫。

例如:我不必查看基于用户名的用户名来创建新的故事;我只需将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链接到他们的故事。因此,应用程序绝不允许他们更改他们的用户名。对于那些仅仅关注链接的人来说,它会导致潜在的噩梦,从而看到它不再存在。

回答

1

请注意您对用户名的评论是独一无二的。 Anita Takeabath一分钟与Seymour Butts结婚,突然想起来,他们想成为邻居。

只是一个念头!

+0

是的,非常好 - 根据@Jakub所说的话(但稍微有趣一些)。 – Mike 2009-10-09 18:31:57

1

我已经使用了和你一样的方法,它工作。你的应用程序表和会员数据库中的表有关系吗?如果是这样,你可能想要删除这种关系。

+0

很高兴知道我不是唯一一个。今天没有链接。 – Mike 2009-10-09 18:22:19

+0

只是为了澄清 - 由于该错误,我不再与我创建的表和aspnet_user表有关系。让我有点不安,但我不认为这应该是一个问题。 – Mike 2009-10-09 18:23:46

1

我唯一的想法是为了将来能够证明你的应用程序,userid会为用户更改用户名提供灵活性,因为userid会保持不变(比如SO)。但这是符合您的应用需求的。然后再次需求往往倾向于改变,而不是开发人员的控制。

+0

你刚刚做出的优秀点!对于我的应用程序,用户名永远不会改变谢谢。 – Mike 2009-10-09 18:30:39

0

它的坏的原因如下:

  1. 你提到了避免额外的数据库调用。但是,通过连接表,不需要对数据库进行“额外”调用。你可以争辩说,加盟比没有加盟贵。但是,商店最有可能需要比用户登录名更多的用户信息(请注意:用户名不唯一,用户登录名称是唯一的)。所以你需要加入大多数数据库操作。

  2. 用户登录名称具有不同的长度,它在加入时使用效果不佳。

编辑:修改后的格式。我仍然在学习如何让我的帖子看起来更好:-)

+0

我在说用户登录名,所以它们将是唯一的。现在就要加入 - 这对选择来说是真的,但是插入怎么办?因此,我创建了一个新故事,新评论等等。我不必首先从用户名获得用户名,然后插入?这就是我想要避免的。 – Mike 2009-10-09 18:36:58

+0

我通常不喜欢问这个问题,但我现在必须问:你为什么试图避免它?在大多数情况下,插入将显着少于选择。所以在这里表演不应该成为一个问题。如果不是表现,你还想要避免什么?我觉得你正在以一个严重的价格交易一些微不足道的东西。 – Codism 2009-10-09 19:08:24

+0

我想我只是采取稍微简单一点,防弹的方式,因为应用程序的用户名是100%唯一的。我现在无法想到它的任何缺点...... – Mike 2009-10-09 19:11:28

0

如果你实现这个的原因是为了更容易访问用户的GUID,我建议让你的FormsAuthentication.SetAuthCookie使用用户的GUID作为名称属性并在整个应用程序中使用User.Identity.Name。

使用用户名作为唯一标识符可能会在未来造成不好的后果。如果您希望将来允许用户更改他们的用户名,那么您将很难实现这一点。