Ignorare prima una proprietà di classe nel codice Entity Framework 4.1


299

La mia comprensione è che l' [NotMapped]attributo non è disponibile fino a EF 5 che è attualmente in CTP, quindi non possiamo usarlo in produzione.

Come posso contrassegnare le proprietà in EF 4.1 da ignorare?

AGGIORNAMENTO: ho notato qualcos'altro di strano. Ho ottenuto l' [NotMapped]attributo per funzionare, ma per qualche motivo, EF 4.1 crea ancora una colonna denominata Disposed nel database anche se public bool Disposed { get; private set; }è contrassegnato da [NotMapped]. La classe implementa IDisposeableovviamente ma non vedo come dovrebbe importare. qualche idea?



Mi sembra che dovrebbe applicarsi anche a Entity Framework 4.1. Controlla questo link: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte

1
@SamLeach: ho già letto quella domanda prima di pubblicare la mia e non ho trovato una soluzione. La domanda è: come ottenere lo stesso in EF4? Ho perso qualcosa in quel post?
Raheel Khan,

Questo è quello che ho pensato anche da quando ho EF 4.1 e posso vedere l'attributo. Ma EF sembra abbastanza felice di ignorarlo completamente nelle mie applicazioni. Questo vale per i tipi nativi e di riferimento, nonché per i tipi di riferimento com come le applicazioni intrerop di MS Office.
Raheel Khan,

Mi dispiace ma ho fatto un test in questo momento con una semplice applicazione e funziona. Potresti fornire un codice di esempio?
ilmatte,

Risposte:


594

È possibile utilizzare l' NotMappedannotazione dei dati degli attributi per indicare a Code-First di escludere una particolare proprietà

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'attributo è incluso nello System.ComponentModel.DataAnnotations spazio dei nomi.

In alternativa puoi farlo con la funzione di Fluent APIoverride OnModelCreatingnella tua 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 versione che ho controllato è EF 4.3, che è l'ultima versione stabile disponibile quando si utilizza NuGet.


Modifica : settembre 2017

Asp.NET Core (2.0)

Annotazione dei dati

Se si utilizza asp.net core ( 2.0 al momento della stesura di questo documento ), l' [NotMapped]attributo può essere utilizzato a livello di proprietà.

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

3
Grazie. È sempre bello vedere le risposte con uno sforzo dietro di loro. In realtà non ho notato la tua ultima riga prima di contrassegnare l'altra risposta come corretta. Dal momento che la tua risposta è arrivata prima, penso che sia giusto cambiare la tua per correggere. Sono sicuro che a @ilmatte non dispiacerà.
Raheel Khan,

13
Con v5> di EF ora vivono in System.ComponentModel.DataAnnotations.Schema
Daveo

quando uso FluentMApping, il campo viene comunque restituito nel gruppo di risultati, sebbene sia NULL. Come ottengo che non venga nemmeno restituito?
Rodney,

8
L'uso di [NotMapped] dirà anche ad altri serializzatori (ad esempio JSON / XML) di non mappare questa proprietà. Se si desidera impedire il mapping solo a una tabella del database, ma si dispone ancora di serializzatori che accedono alla proprietà, è necessario utilizzare l'approccio OnModelCreating.
maxmantz,

Anche se non ho capito esattamente come, questo non funziona con le proprietà ereditate dal framework 6+ dell'attributo e l'API fluente sembra ignorare l'istruzione
PBo

35

A partire da EF 5.0, è necessario includere lo System.ComponentModel.DataAnnotations.Schemaspazio dei nomi.


2
È ancora così? Sto usando EF 6.0 e questo non è più il caso, almeno non per il mio progetto. A meno che non abbia fatto riferimento a uno spazio dei nomi che già da qualche parte fa riferimento a quanto sopra.
JARRRRG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.