5

Estoy jugando con EF Code First y ahora tuve problemas al implementar un MembershipProvider personalizado.MembershipUser y Entity Framework Code First

Código EF En primer lugar he creado mi propia clase de usuario de esta manera:

public class User 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    [Required] 
    public string UserName { get; set; } 
    [Required] 
    public string Password { get; set; } 
    [Required] 
    public string Email { get; set; } 
    [Required] 
    public bool IsApproved { get; set; } 
    public DateTime? LastLoginDate { get; set; } 
    public DateTime? LastActivityDate { get; set; } 
    [Required] 
    public DateTime CreationDate { get; set; } 
    [Required] 
    public string ApplicationName { get; set; } 
} 

También he implementado algunas funciones de mi MembershipProvider personalizado para EF ya, pero algunos de ellos requieren ahora MembershipUser ya sea como un parámetro o una valor de retorno

public MembershipUser GetUser(string username, bool userIsOnline) 

Mi primer pensamiento fue para heredar mi clase de usuario MembershipUser, pero luego pierde el control sobre las propiedades. ¿Eso funcionaría incluso con EF Code First?

Una idea alternativa es crear un método ToMembershipUser() para mi clase de usuario. ¿Sería eso una opción? ¿Qué debería considerar?

¿Cuál es la mejor manera de manejar esto?

Respuesta

8

Puede usar el Patrón de adaptador para resolver este problema.

public class CustomUser : MembershipUser 
{ 
    public CustomUser(string providername, 
        User userAccount) : 
     base(providername, 
         userAccount.UserName, 
         userAccount.Id, 
         userAccount.Email, 
         passwordQuestion, 
         string.Empty, 
         true, 
         false, 
         userAccount.CreationDate, 
         userAccount.LastLoginDate, 
         userAccount.LastActivityDate, 
         new DateTime(), 
         new DateTime()) 
    { 
     UserAccount = userAccount; 
    } 

    public User UserAccount { get; private set; } 
} 

Personalice los parámetros pasados ​​al constructor base según el modelo de su entidad.

+0

Eso parece funcionar perfectamente, gracias! – magnattic

+0

Heredé mi 'CustomUser' de' MembershipUser' y surgió el problema al guardar 'CustomUser' en la base de datos utilizando Entity Framework. Si alguien usara el código SQL, aquí está el procedimiento oficial para el usuario de membresía personalizado [Cómo: Implementar un usuario de membresía personalizado] (http://msdn.microsoft.com/en-us/library/ms366730.aspx) – twnaing

+1

No olvide anotar la clase 'CusomUser' con la anotación de datos' [NotMapped] '. De lo contrario, recibirá el error de que 'CustomUser' no tenga la clave única. – twnaing

Cuestiones relacionadas