Tuesday, March 2, 2010

ASP.NET Membership / Custom DB Part 2

Tentando seguir uma corrente coerente, vamos pegar no último artigo de ASP.NET e dar um uso prático ao que foi exposto.

Pré-Requisito: Web Application criada com a DB correspondente configurada; Login e CreateUserWizard Controls adicionados. A DB chama-se "Tuganologia".

Vamos usar LINQtoSQL, portanto vamos começar por criar as suas respectivas classes:

- Add new Item --> LINQtoSQL Classes , nome “TuganologiaLINQtoSQL.dbml” --> Add

De seguida ir ao Database Explorar e arrastar todas as tables (custom e aspnet membership) para o .dbml ; com isto é criado o Data Context do TuganologiaLINQtoSQL.


O que se pretende com este post é fazer a bridge entre as tabelas aspnet e as custom. Na nossa DB “Tuganologia”, criei uma tabela denominada “User”, e é precisamente nessa tabela que vai ocorrer a bridge.
Qual o control onde tal deverá acontecer? No CreateUserWizard obviamente.

Temos um CreateUserWizard de ID=”CreateUserWizard1” e o que nos interessa é alterar o evento “CreatedUser” (ocorre imediatamente após ter sido atribuído um GUID para o userID do user recém registado). Vamos então alterar esse evento. Duplo click no “CreatedUser” event e vamos parar ao code behind:

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{

}


Antes de alterar o evento, há algo a fazer primeiro: Resolvi criar uma classe denominada de “TuganologiaDataLayer.cs” que pode vir a conter todas as funções de modulação da nossa DB. Vamos adicionar a seguinte função:


public class TuganologiaDataLayer
{
TuganologiaLINQtoSQLDataContext database = new TuganologiaLINQtoSQLDataContext();

public void CreateUser(Guid userId, string email)
{
User userDetails = new User();
userDetails.userID = userId;
userDetails.firstName = "";
userDetails.lastName = "";
userDetails.email = email;

database.Users.InsertOnSubmit(userDetails);
database.SubmitChanges();
}
}



Como podem observar criámos uma nova instância do nosso Data Context e na função tratámos o User como um objecto (LINQ traz-nos ORM, Object Relational Mapping, à Framework .NET, o que nos permite manipular a DB como "pure objects"). O resto já vão perceber quando finalmente alterarmos o evento “CreatedUser”:

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{

MembershipUser newUser = Membership.GetUser(((CreateUserWizard)sender).UserName);

Guid newUserId = (Guid)newUser.ProviderUserKey;

// aqui é que fazemos a bridge!
TuganologiaDataLayer dataLayer = new TuganologiaDataLayer();
dataLayer.CreateUser(newUserId, ((CreateUserWizard)sender).Email);
}

Este evento vai executar o GetUser do controlo “CreateUserWizard” (User que acabou de se registar no nosso site); após isso criamos o nosso Guid “newUserId” , que vai corresponder à Guid atribuída a esse user aquando do seu registo ((Guid)newUser.ProviderUserKey).
Resta-nos instanciar a nossa Data Layer e chamar a nossa função “CreateUser”.

A nossa custom table “User” tem agora o userID (Guid) e o Email inserido no CreateUserWizard. =)


Qualquer dúvida contactar via: tuganologia@gmail.com

TR