2012-01-18 22 views
5

tengo un modelo de la siguiente manera:Entity Framework CODIGO - Ignorar base de la Clase

public class User : System.Web.Security.MembershipUser 
{ 
public int UserId { get; set; } 
    public string SomeProperty { get; set; } 
} 

Cuando se genera mi base de datos Quiero que el marco de la entidad para ignorar MembershipUser y sólo generan una tabla con el nombre del usuario con los dos inmuebles de la clase de Usuario. He intentado lo siguiente en vano.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Ignore<System.Web.Security.MembershipUser>(); 
} 
+0

lo que está mal con modelBuilder.Ignore ()? No funcionó? – vk5880

Respuesta

2

NotMappedAttribute atributo es su amigo:

[MetadataType(typeof(UserMd)] 
public class User : System.Web.Security.MembershipUser 
{ 
    ////read description bellow code 
    //static User() 
    //{ 
    // var type = typeof(User); 
    // TypeDescriptor.AddProviderTransparent(
    // new AssociatedMetadataTypeTypeDescriptionProvider(type), type); 
    //}   

    public int UserId { get; set; } 
    public string SomeProperty { get; set; } 

    internal class UserMd 
    { 
     [NotMapped] 
     public string UserName { get; set; } 
    } 
} 

No estoy seguro de si el código procesa primero los metadatos automáticamente por sí mismo, trate de lo anterior, y si no funciona, conecte los metadatos manualmente (es decir, descomentar las líneas comentadas).

actualización me gusta la solución anterior mejor, pero si es demasiado detallado para usted, utilice el método StructuralTypeConfiguration<TStructuralType>.Ignore<TProperty> Method:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    var config = modelBuilder.Entity<User>(); 
    config.Ignore(u => u.UserName); 
} 
+0

@MystereMan lo siento, respuesta actualizada. – Shimmy

+0

Cuando se usa con el constructor estático esto funciona. Bastante feo sin embargo. Me encantaría ver una solución más elegante si existe. – Mark

+0

OK. He editado mi respuesta. – Shimmy

8

Hay dos opciones para usted. Una es ignorar todas las propiedades de la clase base llamando al Ignore para cada propiedad.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().Ignore(u => u.ProviderUserKey); 
    modelBuilder.Entity<User>().Ignore(u => u.LastActivityDate); 
    // and so on for all base class properties 
} 

Otra opción sería utilizar la composición para recuperar una instancia de su clase MembershipUserUser. Aquí User clase no se hereda de MembershipUser.

public class User 
{ 
    public int UserId { get; set; } 
    public string SomeProperty { get; set; } 

    public MembershipUser MembershipUser 
    { 
     get 
     { 
      // create an instance using the available properties and return 
     } 
    } 
} 

y el mapa de la siguiente manera

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().Ignore(u => u.MembershipUser); 
    modelBuilder.Ignore<System.Web.Security.MembershipUser>(); 

} 
+0

A menudo estoy de acuerdo con el consejo de Preferir Composición Sobre Herencia. – Suamere

Cuestiones relacionadas