web-dev-qa-db-fra.com

Comment ne pas persister propriété code EF4 en premier?

Comment créer des propriétés non persistantes à l'aide de codefirst EF4?

MS dit qu'il y a un attribut StoreIgnore, mais je ne le trouve pas.

http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx

Existe-t-il un moyen de le configurer en utilisant EntityConfiguration?

49
Adam Bell

Dans EF Code-First CTP5, vous pouvez utiliser l'annotation [NotMapped].

using System.ComponentModel.DataAnnotations;
public class Song
{
    public int Id { get; set; }
    public string Title { get; set; }

    [NotMapped]
    public int Track { get; set; }
62
Matt Frear

Actuellement, je connais deux façons de le faire.

  1. Ajoutez le mot clé 'dynamic' à la propriété, ce qui empêche le mappeur de la conserver:

    private Gender gender;
    public dynamic Gender
    {
        get { return gender; }
        set { gender = value; }
    }
    
  2. Remplacez OnModelCreating dans DBContext et remappez le type entier, en omettant les propriétés que vous ne souhaitez pas conserver:

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Person>().MapSingleType(p => new { p.FirstName, ... });
    }         
    

En utilisant la méthode 2, si l'équipe EF introduit Ignore, vous pourrez facilement changer le code en:

     modelBuilder.Entity<Person>().Property(p => p.IgnoreThis).Ignore();
4
Rob Kent

Je ne suis pas sûr que ce soit encore disponible. 

Sur cette page MSDN l'attribut Ignore et l'API sont décrits, mais ci-dessous, dans les commentaires, quelqu'un écrit le 4 juin 2010: 

Vous pourrez ignorer les propriétés dans la prochaine version de Code First,

1
Henk Holterman

Si vous ne souhaitez pas utiliser les annotations, vous pouvez utiliser le API Fluent . Remplacez la OnModelCreating et utilisez la méthode Ignore() de DbModelBuilder. En supposant que vous ayez une entité 'Song':

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Song>().Ignore(p => p.PropToIgnore);
    }
}

Vous pouvez également utiliser EntityTypeConfiguration pour déplacer les configurations dans des classes séparées pour une meilleure gestion:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new SongConfiguration());
    }

}

public class SongConfiguration : EntityTypeConfiguration<Song>
{
    public SongConfiguration()
    {
        Ignore(p => p.PropToIgnore);
    }
}
1
Marcos Dimitrio

Ajoutez À l'aide de System.ComponentModel.DataAnnotations. Schema À la classe de modèle. (Doit inclure "SCHEMA")

Ajoutez des annotations de données [Non mappées] au (x) champ (s) que vous voulez empêcher de persister (c'est-à-dire, ne pas enregistrer dans la base de données).

Cela évitera leur ajout en tant que colonne à la table de la base de données.

Remarque: les réponses précédentes ont peut-être inclus ces bits, mais ils ne contenaient pas l'intégralité de la clause "using". Ils ont simplement laissé de côté "schéma" - sous lequel l'attribut NotMapped est défini.

0
wopanese