Ignorar una propiedad de clase en Entity Framework 4.1 Code First

299

Tengo entendido que el [NotMapped]atributo no está disponible hasta EF 5, que actualmente está en CTP, por lo que no podemos usarlo en producción.

¿Cómo puedo marcar las propiedades en EF 4.1 para que se ignoren?

ACTUALIZACIÓN: Noté algo más extraño. Obtuve el [NotMapped]atributo para trabajar, pero por alguna razón, EF 4.1 todavía crea una columna llamada Disposed en la base de datos a pesar de que public bool Disposed { get; private set; }está marcado con [NotMapped]. La clase se implementa, IDisposeablepor supuesto, pero no veo cómo debería importar eso. ¿Alguna idea?

Raheel Khan
fuente
Me parece que también debería aplicarse a Entity Framework 4.1. Consulte este enlace: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte
1
@SamLeach: ya leí esa pregunta antes de publicar la mía y no encontré una solución. La pregunta es ¿cómo lograr lo mismo en EF4? ¿Me he perdido algo en esa publicación?
Raheel Khan
Eso es lo que pensé también, ya que tengo EF 4.1 y puedo ver el atributo. Pero EF parece bastante feliz de ignorarlo por completo en mis aplicaciones. Esto es cierto para los tipos nativos y de referencia, así como para los tipos de referencia com, como las aplicaciones integradas de MS office.
Raheel Khan
Lo siento, pero hice una prueba en este momento con una aplicación simple y funciona. ¿Podría proporcionar un código de muestra?
ilmatte

Respuestas:

594

Puede usar la NotMappedanotación de datos de atributo para indicar a Code-First que excluya una propiedad en particular

public class Customer
{
    public int CustomerID { set; get; }
    public string FirstName { set; get; } 
    public string LastName{ set; get; } 
    [NotMapped]
    public int Age { set; get; }
}

[NotMapped]El atributo se incluye en el System.ComponentModel.DataAnnotations espacio de nombres.

Alternativamente, puede hacer esto con la función de Fluent APIanulación OnModelCreatingen su DBContextclase:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}

http://msdn.microsoft.com/en-us/library/hh295847(v=vs.103).aspx

La versión que verifiqué es EF 4.3, que es la última versión estable disponible cuando usas NuGet.


Editar : SEP 2017

Asp.NET Core (2.0)

Anotación de datos

Si está utilizando asp.net core ( 2.0 en el momento de escribir este artículo ), el [NotMapped]atributo se puede usar en el nivel de propiedad.

public class Customer
{
    public int Id { set; get; }
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
    [NotMapped]
    public int FullName { set; get; }
}

API fluida

public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Ignore(t => t.FullName);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Customer> Customers { get; set; }
}
Shyju
fuente
3
Gracias. Siempre es bueno ver respuestas con esfuerzo detrás de ellas. De hecho, no noté tu última línea antes de marcar la otra respuesta como correcta. Como su respuesta llegó antes, creo que es justo cambiar la suya para corregirla. Estoy seguro de que a @ilmatte no le importará.
Raheel Khan
13
Con v5> de EF, estos ahora viven en System.ComponentModel.DataAnnotations.Schema
Daveo
cuando uso FluentMApping, el campo aún se devuelve en el conjunto de resultados, aunque NULL sabe. ¿Cómo consigo que ni siquiera sea devuelto?
Rodney
8
El uso de [NotMapped] también le indicará a otros serializadores (JSON / XML, por ejemplo) que no asignen esta propiedad. Si solo desea evitar la asignación a una tabla de base de datos, pero aún así los serializadores acceden a la propiedad, debe usar el enfoque OnModelCreating.
maxmantz
A pesar de que no he descubierto cómo exactamente, esto no funciona con propiedades heredadas en marco de la entidad 6+ el atributo y API fluida parecen ignorar la instrucción
PBO
35

A partir de EF 5.0, debe incluir el System.ComponentModel.DataAnnotations.Schemaespacio de nombres.

Shane
fuente
2
¿Sigue siendo el caso? Estoy usando EF 6.0 y este ya no es el caso, al menos no para mi proyecto. A menos que haya hecho referencia a un espacio de nombres que ya en alguna parte hace referencia a lo anterior.
JARRRRG