web-dev-qa-db-fra.com

Ignorer une propriété de classe dans Entity Framework 4.1 Code First

Si j'ai bien compris, l'attribut [NotMapped] n'est pas disponible avant l'EF 5 actuellement en CTP, nous ne pouvons donc pas l'utiliser en production.

Comment puis-je marquer les propriétés dans EF 4.1 pour les ignorer?

PDATE: J'ai remarqué quelque chose d'autre d'étrange. L'attribut [NotMapped] a fonctionné, mais pour une raison quelconque, EF 4.1 crée toujours une colonne nommée Disposed dans la base de données, même si le public bool Disposed { get; private set; } est marqué de [NotMapped]. La classe implémente IDisposeable bien sûr, mais je ne vois pas en quoi cela devrait avoir de l'importance. Des pensées?

286
Raheel Khan

Vous pouvez utiliser l'annotation de données d'attribut NotMapped pour demander à Code-First d'exclure une propriété particulière.

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

L'attribut [NotMapped] est inclus dans l'espace System.ComponentModel.DataAnnotationsnames.

Vous pouvez également le faire avec Fluent API annulant la fonction OnModelCreating dans votre classe DBContext:

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 version que j'ai vérifiée est EF 4.3, qui est la dernière version stable disponible lorsque vous utilisez NuGet.


Modifier : SEP 2017

Asp.NET Core (2.0)

Annotation de données

Si vous utilisez asp.net core ( 2.0 au moment de l'écriture ), l'attribut [NotMapped] peut être utilisé au niveau de la propriété.

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 fluide

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; }
}
564
Shyju

A partir de EF 5.0, vous devez inclure l'espace de noms System.ComponentModel.DataAnnotations.Schema.

33
Shane