2011-01-23 14 views
19

Tengo modelos basados ​​en EF Code First y quiero usarlos con el MembershipProvider predeterminado, pero no sé cómo escribir el modelo correctamente, así que no borraré todos mis datos al recrear las tablas cuando había cambios realizados en el modelo.¿Cómo utilizar el proveedor de membresía con el código EF primero?

+0

Amplíe: ¿está tratando de crear la base de datos de membresía usted mismo a través del código primero en lugar de utilizar las secuencias de comandos SQL instaladas con .NET? – Richard

+0

Db se genera con aspnet_regsql, pero no sé cómo unirlo con las funciones de EF Code First, como cuando creo el modelo/clase, EF genera la tabla. Ahora borra todas las tablas creadas por aspnet_regsql. – Santas

Respuesta

2

Actualmente (EF 4.1 CTP) EF Code First no tiene esa opción. Siempre deja caer una tabla si realizó cambios en el modelo.

Actualización:

EF 4.1 RTM permite crear un inicializador base de datos personalizada y especificar la creación de objetos de base de datos y la siembra de datos.

9

Tenga una mirada en este proyecto

http://codefirstmembership.codeplex.com/

Tiene clases de entidad para los usuarios y roles, así como implementador de roles y como proveedor de membresía. Si incluye los usuarios y las funciones en su clase de contexto de datos, las tablas se crearán en su base de datos.

+0

En el momento de escribir esto, puedo confirmar que esta sigue siendo una buena solución, pero al igual que la mayoría de las cosas en Codeplex, está muy mal documentada. – JustAnotherDeveloper

1

También existe mi biblioteca que básicamente le permite definir cómo se debe configurar casi todo, incluyendo: tipo de clave, dónde se encuentra su objeto de contexto y dónde están ubicadas sus entidades de usuario/rol. Extensible usando clases base o interfaces abstractas. También funciona bastante bien con el patrón de repositorio/unidad de trabajo/IoC Containers.

Fuente: https://github.com/holyprin/holyprin.web.security

NuGet: https://nuget.org/packages/Holyprin.Web.Security

7

Su pregunta tiene dos partes.

  1. Cómo utilizar la API de miembros asp.net con el código de EF en primer lugar?
  2. ¿Cómo conservar los datos existentes cuando el modelo cambia?

cómo Cómo conservar los datos existentes cuando se modifican los modelos, ya que con EF 4.0/asp.net mvc 3, las migraciones de bases de datos aún no son compatibles. Tendrá que pasar a asp.net mvc 4.0/EF 4.3 donde las migraciones de bases de datos son compatibles o utilizar alternativas similares, pero su versión beta sigue siendo.

asp.net mvc 4.0 database migration in scott gu's blog

Ahora que se acerca al punto sobre el uso de proveedor de pertenencia asp.net con el código de EF en primer lugar. Hay un par de retos:

  1. No podemos/debemos no hacer un JOIN con las tablas de proveedor de pertenencia asp.net. No es recomendable, por lo que mi sugerencia será crear una "clase de adaptador" para las clases de proveedores de membresía de asp.net.Por ejemplo:

    public class UserAdapter 
    { 
    // all user related attributes. Not stored in membership schema, but your schema 
    
        public string UserProxyName; 
    
        // some attributes stored in membership schema 
        [NotMapped] 
        public string Email { 
         get 
         { 
           Membership.GetUser(UserProxyName).Email; 
         }     
        }   
    
        // some attributes stored in membership schema and not in your schema 
        [NotMapped] 
        public string[] UserRoles 
        { 
        get 
        { 
         return Roles.GetRolesForUser(UserProxyName); 
        }   
        } 
    
    } 
    

    ahora para actualizar la información, puede escribir a ciertas funciones del mismo modelo, sin embargo yo sugeriría crear un UserRepository con el patrón de diseño del repositorio para manejar las operaciones CRUD usuario.

  2. El segundo desafío es cómo crear la base de datos en la primera ejecución. Como el inicio de sesión se convierte en un problema, si desea generar la información del usuario, ejecutar aspnet_regsql por separado no es eficiente, ya que se espera el esquema de membresía antes de que ocurra la siembra. Me encontré con este artículo agradable, con algunos ajustes que trabajó para mí:

asp.net membership and EF

0

En mis DbContext.cs presentar Tengo una función de la semilla donde yo llamo el ApplicationServices.InstallServices() para instalar el ASP.NET Membresía a mi base de datos. Ahora, cada vez que mi inicializador descarta la base de datos, vuelve a crear el esquema de Membresía de ASP.NET.

public class PanelInitializer : DropCreateDatabaseAlways<PanelContext> 
{ 
    protected override void Seed(PanelContext context) 
    { 
     //Install ASP.NET Membership 
     ApplicationServices.InstallServices(SqlFeatures.Membership | SqlFeatures.RoleManager); 

     new List<Panel> 
      { 

Los ApplicationServices clase

using System.Configuration; 
using System.Data.SqlClient; 
using System.Web.Management; 

namespace Lansw.Panels.DataAccess.Contexts 
{ 
    public class ApplicationServices 
    { 
     readonly static string DefaultConnectionString = ConfigurationManager.AppSettings["DefaultConnectionString"]; 
     readonly static string ConnectionString = ConfigurationManager.ConnectionStrings[DefaultConnectionString].ConnectionString; 
     readonly static SqlConnectionStringBuilder MyBuilder = new SqlConnectionStringBuilder(ConnectionString); 

     public static void InstallServices(SqlFeatures sqlFeatures) 
     { 
      SqlServices.Install(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString); 
     } 

     public static void UninstallServices(SqlFeatures sqlFeatures) 
     { 
      SqlServices.Uninstall(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString); 
     } 
    } 
} 

Gracias a @ImarSpaanjaarshttp://imar.spaanjaars.com/563/using-entity-framework-code-first-and-aspnet-membership-together.

Cuestiones relacionadas