50
votes

How do I make non persisted properties using codefirst EF4?

MS says there is a StoreIgnore Attribute, but I cannot find it.

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

Is there a way to set this up using EntityConfiguration?

5
+1 really good question. – Ladislav Mrnka
Any update on this? I'm using VS2010 with EF4.0 released and I still can't find StoreIgnoreAttribute. Did it get dropped? – Simon Gillbee

5 Answers

64
votes

In EF Code-First CTP5, you can use the [NotMapped] annotation.

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

    [NotMapped]
    public int Track { get; set; }
4
votes

Currently, I know of two ways to do it.

  1. Add the 'dynamic' keyword to the property, which stops the mapper persisting it:

    private Gender gender;
    public dynamic Gender
    {
        get { return gender; }
        set { gender = value; }
    }
    
  2. Override OnModelCreating in DBContext and remap the whole type, omitting the properties you don't want to persist:

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

Using method 2, if the EF team introduce Ignore, you will be able to easily change the code to:

     modelBuilder.Entity<Person>().Property(p => p.IgnoreThis).Ignore();
2
votes

If you don't want to use Annotations, you can use the Fluent API. Override the OnModelCreating and use DbModelBuilder's Ignore() method. Supposing you have a 'Song' entity:

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

You can also use EntityTypeConfiguration to move configurations to separate classes for better manageability:

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
votes

I'm not sure if this is available yet.

On this MSDN page the Ignore Attribute and API are described but below, in the comments, somebody writes on 4 june 2010:

You will be able to ignore properties in the next Code First release,

0
votes

Add using System.ComponentModel.DataAnnotations.Schema to the model class. (Must include "SCHEMA")

Add [NotMapped] data annotation to the field(s) you want to keep from persisting (ie. not save to database).

This will prevent them from being added as a column to the table in the db.

Please note - previous answers may have included these bits, but they did not have the full "using" clause. They merely left off "schema" - under which the NotMapped attribute is defined.