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

299

Ma compréhension est que l' [NotMapped]attribut n'est pas disponible jusqu'à EF 5 qui est actuellement dans CTP, donc nous ne pouvons pas l'utiliser en production.

Comment puis-je marquer des propriétés dans EF 4.1 à ignorer?

MISE À JOUR: J'ai remarqué quelque chose d'autre étrange. J'ai obtenu l' [NotMapped]attribut pour fonctionner, 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é avec [NotMapped]. La classe implémente IDisposeablebien sûr mais je ne vois pas comment cela devrait être important. Des pensées?

Raheel Khan
la source
Il me semble que cela devrait également s'appliquer à Entity Framework 4.1. Vérifiez ce lien: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte
1
@SamLeach: J'ai déjà lu cette question avant de poster la mienne et je n'ai pas trouvé de solution. La question est de savoir comment obtenir la même chose dans EF4? Ai-je raté quelque chose dans ce post?
Raheel Khan
C'est ce que je pensais aussi puisque j'ai EF 4.1 et que je peux voir l'attribut. Mais EF semble assez heureux de l'ignorer complètement dans mes applications. Cela est vrai pour les types natifs et de référence ainsi que pour les types de référence com tels que les applications intrerop MS Office.
Raheel Khan
Je suis désolé mais j'ai fait un test en ce moment avec une application simple et ça marche. Pourriez-vous fournir un exemple de code?
ilmatte

Réponses:

594

Vous pouvez utiliser l' NotMappedannotation de données d'attribut 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; }
}

[NotMapped]l'attribut est inclus dans l' System.ComponentModel.DataAnnotations espace de noms.

Vous pouvez également le faire avec Fluent APIune OnModelCreatingfonction prioritaire dans votre DBContextclasse:

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.3la dernière version stable disponible lorsque vous utilisez NuGet.


Édition : SEP 2017

Asp.NET Core (2.0)

Annotation des données

Si vous utilisez le noyau asp.net ( 2.0 au moment d'écrire ces lignes ), l' [NotMapped]attribut 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 Fluent

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
la source
3
Merci. Il est toujours bon de voir les réponses avec effort derrière elles. En fait, je n'ai pas remarqué votre dernière ligne avant de marquer une autre réponse comme correcte. Étant donné que votre réponse est déjà arrivée, je pense qu'il est juste de changer la vôtre pour la corriger. Je suis sûr que @ilmatte ne m'en voudra pas.
Raheel Khan
13
Avec v5> d'EF, ceux-ci sont désormais disponibles dans System.ComponentModel.DataAnnotations.Schema
Daveo
lorsque j'utilise FluentMApping, le champ est toujours renvoyé dans l'ensemble de résultats, bien qu'il soit NULL sais. Comment puis-je faire en sorte qu'il ne soit même pas retourné?
Rodney
8
L'utilisation de [NotMapped] indiquera également aux autres sérialiseurs (JSON / XML par exemple) de ne pas mapper cette propriété. Si vous souhaitez uniquement empêcher le mappage vers une table de base de données, mais que les sérialiseurs ont toujours accès à la propriété, vous devez utiliser l'approche OnModelCreating.
maxmantz
Bien que je n'aie pas compris exactement comment, cela ne fonctionne pas avec les propriétés héritées du framework d'entité 6+, l'attribut et l'api couramment semblent ignorer l'instruction
PBo
35

Depuis EF 5.0, vous devez inclure l' System.ComponentModel.DataAnnotations.Schemaespace de noms.

Shane
la source
2
Est-ce toujours le cas? J'utilise EF 6.0 et ce n'est plus le cas du moins pour mon projet. Sauf si j'ai référencé un espace de noms qui fait déjà quelque part référence à ce qui précède.
JARRRRG