Mike
Mike

Reputation: 2922

Am I going about this the wrong way?

This is my first MVC/Linq to SQL Application. I'm using the out of the box SQL Membership with ASP.NET to track users through my system.

As most of you know, the UserId is a guid, great. However, to link other user-created tables in the system, I decided to go with username instead of userid. The reason I did this was because:

  1. Username is unique anyway
  2. It prevents me from having to make an extra call when handling db functions.

So for example: I don't have to do a look up on the userid based on username to create a new story; I simply insert User.Identity.Name into the story table.

Now I did run into some nasty complication, which seems to be related to this. It worked fine on my local machine, but not on the host. I continually got an error that went something like this:

"System.InvalidCastException: Specified cast is not valid. at System.Data.Linq.IdentityManager.StandardIdentityManager.SingleKeyManager"...

This happened whenever an insert on the db occurred on the host. If I understand correctly, this is a bug currently that happens when you link a non integer field (in my case username) to another table of a non integer field (username in aspnet_user). Although the bug reported seems a little bit different, maybe they are similar?

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358

In any case, MS bug or not - is storing the username instead of the userid in my tables a bad idea? If it is, why?

Update

I just wanted to add some more context here. A good point people are bringing up is that this is dangerous if I want to allow users to change their username in the future. Perfectly valid!

However, this application relies heavily on the username. Each user creates one and only one story. They then link to their story by using: mysite/username. Therefore, the application will never allow them to change their username. It would cause a potential nightmare for people who follow the link only to see it no longer exists.

Upvotes: 1

Views: 181

Answers (5)

Omar
Omar

Reputation: 40182

If the reason you're implementing this is for easier access to the User's GUID, I suggest having your FormsAuthentication.SetAuthCookie use the users's GUID as the name property and use User.Identity.Name throughout your application.

Using username as the unique identifier could have bad consequences in the future. Should you want to allow the user change their username in the future, you will have a hard time implementing that.

Upvotes: 0

Codism
Codism

Reputation: 6224

It's bad for the following reasons:

  1. You mentioned avoiding extra database calls. However, by joining tables, there is no "extra" call to database. You can argue that joining is expensive than no joining at all. However, most likely, a store needs more user information than a user login name (note: user names are not unique, user login names are unique). So you need joining anyway for most database operations.

  2. User login names have different length, it doesn't perform well when they are used in joining.

Edit: modified format. I am still learning how to make my post look better:-)

Upvotes: 0

JonH
JonH

Reputation: 33143

Be careful regarding your comment regarding usernames are unique. The minute Anita Takeabath gets married to Seymour Butts suddenly atakebath wants to be abutts.

Just a thought!

Upvotes: 1

Jakub
Jakub

Reputation: 20475

My only thought would be in order to future proof your application, the userid would offer flexibility in users changing their username, as the userid would remain constant (like SO for instance). But that is something that has to fit your application requirements. Then again requirements often tend to change wihtout a developers control.

Upvotes: 1

DrivenDevelopment
DrivenDevelopment

Reputation: 559

I've used the same approach as you and it works. Do you have a relationship between your application table and the table from the membership db? If so, you may want to remove that relationship.

Upvotes: 1

Related Questions