¿Cómo combinar el uso de la API de membresía con datos relacionados con la aplicación?

Diseñando una nueva aplicación en asp.net 4 Tengo que tomar una decisión sobre cómo usar una API de Membresía MS SQL junto con mis propios datos en la base de datos MS SQL. En primer lugar, necesito almacenar y acceder a los datos del perfil de usuario de una manera más flexible que el proveedor de perfiles. En segundo lugar, me gustaría vincular otra información relacionada con el usuario (por ejemplo, pedidos).

No importa dónde almacene sus tablas aspnetdb (en la base de datos separada o en la misma base de datos con sus datos), el problema sigue siendo cómo mantener sincronizados sus datos.

Después de una investigación, veo las siguientes opciones relevantes:
1. ID de usuario de clave externa de asp_Users (sugerido en este tutorial).
2. Sin clave externa: use transacciones (sugeridas aquí ).
3. Sin clave externa: use AccountController personalizado (lo que sea que se sugiera aquí ).
4. Tabla adicional que vincula Membership UserId (uid) con UserId personalizado (int).
5. …

Por un lado, me gusta la primera solución, ya que es bastante sencilla y se sugiere en un tutorial oficial de asp.net.

Por otro lado, los oponentes señalan de manera bastante razonable que el uso de claves externas rompe la idea general de proveedores que se supone ayudan a separar preocupaciones y son intercambiables. Pero, desafortunadamente, no incluyen mucho los detalles de implementación, por lo que no es realmente fácil estimar esas sugerencias en términos de relevancia y facilidad de implementación.

Entonces, ¿cuál es la mejor opción para abordar esto? Además, ¿cómo se vería la implementación? ¿Sería suficiente usar solo un código adicional de ADO.NET o LINQ, o vale la pena implementar un Proveedor de Membresía y / o Perfil personalizado?

Gracias de antemano.

    El primero es el enfoque más simple. Agregue el GUID del usuario como una clave externa en las tablas relacionadas (fe Ordered_by). No veo dónde rompe separando preocupaciones. Si desea mantener el registro de pedidos en la base de datos, también debe mantener al usuario que lo ordenó, eso tiene mucho sentido.

    He utilizado la opción 4 con éxito en mi aplicación actual. aspnet_UserID una tabla aspnet_UserID con idUser int como clave primaria y fiUser (el GUID de los aspnet_Users ) como clave externa. Aquí está el modelo:

    Modelo de datos

    (Nota: el User es la tabla aspnet_Users estándar creada a través de aspnet_regsql.exe y aspnet_UserId es mi tabla personalizada que mapea cada Guid con mi int-ID)

    Ahora estoy almacenando solo mi idUser como FK en todas las tablas relacionadas (como en su Tabla de Pedidos). Eso tiene la ventaja de menos almacenamiento y más ID de usuario legibles (nunca podría recordar un GUID). Tal vez esté algo más separado con esta “mesa de envoltura”, pero esa no era mi intención principal.

    Puede cambiar la regla de eliminación en sus teclas extranjeras si desea controlar el comportamiento. Establézcalo en Cascade si desea eliminar todos los pedidos ordenados por el usuario que está eliminando o configurarlo en no Action si desea mantener este orden.

    No puedo sugerir ninguna alternativa para la pregunta de perfil porque no ha mencionado lo que quiere decir con “necesidad de almacenar y acceder a los datos de perfil de usuario de manera más flexible que el proveedor de perfiles compatible”.

    Debería considerar escribir su propio proveedor de membresía personalizado que use las tablas / datos según su necesidad (en lugar de usar el esquema provisto por ASP.NET).

    Consulte este ejemplo de MSDn ( esquema , código ) para escribir un proveedor personalizado: este ejemplo usa OLEDB para acceder a la base de datos. Hay otra muestra aquí : usa el directorio activo como una tienda.