Ignorando uma propriedade de classe no Entity Framework 4.1 Code First

299

Meu entendimento é que o [NotMapped]atributo não está disponível até o EF 5, que está atualmente no CTP, portanto não podemos usá-lo na produção.

Como posso marcar propriedades no EF 4.1 para serem ignoradas?

ATUALIZAÇÃO: Eu notei algo mais estranho. O [NotMapped]atributo funcionou, mas, por algum motivo, o EF 4.1 ainda cria uma coluna chamada Disposed no banco de dados, mesmo que public bool Disposed { get; private set; }esteja marcada com [NotMapped]. A aula é implementada, é IDisposeableclaro, mas não vejo como isso deve importar. Alguma ideia?

Raheel Khan
fonte
Parece-me que deveria se aplicar ao Entity Framework 4.1 também. Confira neste link: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/...
ilmatte
1
@ SamLeach: Eu já li essa pergunta antes de postar a minha e não encontrei uma solução. A questão é como conseguir o mesmo no EF4? Perdi alguma coisa naquele post?
precisa
Foi o que pensei, já que tenho o EF 4.1 e posso ver o atributo. Mas a EF parece muito feliz em ignorá-lo completamente em meus aplicativos. Isso vale para tipos nativos e de referência, bem como para tipos de referência com, como aplicativos de interoperabilidade do MS office.
precisa
Sinto muito, mas fiz um teste agora com um aplicativo simples e funciona. Você poderia fornecer código de exemplo?
precisa saber é

Respostas:

594

Você pode usar a NotMappedanotação de dados do atributo para instruir o Code-First a excluir uma propriedade específica

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]O atributo está incluído no System.ComponentModel.DataAnnotations espaço para nome.

Como alternativa, você pode fazer isso com a função de Fluent APIsubstituição OnModelCreatingem sua 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

A versão que verifiquei é EF 4.3a versão estável mais recente disponível quando você usa o NuGet.


Edição : SEP 2017

Asp.NET Core (2.0)

Anotação de dados

Se você estiver usando o núcleo do asp.net ( 2.0 no momento da redação deste documento ), o [NotMapped]atributo poderá ser usado no nível da propriedade.

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 fluente

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
fonte
3
Obrigado. É sempre bom ver respostas com esforço por trás delas. Na verdade, eu não notei sua última linha antes de marcar a outra resposta como correta. Como sua resposta já chegou antes, acho justo alterar a sua para corrigir. Tenho certeza que @ilmatte não vai se importar.
precisa
13
Com v5> da EF estes agora ao vivo em System.ComponentModel.DataAnnotations.Schema
Daveo
quando eu uso o FluentMApping, o campo ainda é retornado no conjunto de resultados, embora NULL saiba. Como faço para que ele nem seja devolvido?
Rodney
8
O uso de [NotMapped] também informará outros serializadores (JSON / XML por exemplo) para não mapear essa propriedade. Se você deseja impedir apenas o mapeamento para uma tabela de banco de dados, mas ainda tiver serializadores acessando a propriedade, use a abordagem OnModelCreating.
28516 maxmantz
Embora eu havent exatamente descobriu como, isso não funciona com propriedades herdadas na estrutura de entidade 6+ o atributo e api fluente parecem ignorar a instrução
PBo
35

No EF 5.0, você precisa incluir o System.ComponentModel.DataAnnotations.Schemaespaço para nome.

Shane
fonte
2
Ainda é esse o caso? Estou usando o EF 6.0 e esse não é mais o caso, pelo menos não para o meu projeto. A menos que eu tenha mencionado um espaço para nome que já faz referência a algum lugar acima.
JARRRRG