Ignorieren einer Klasseneigenschaft in Entity Framework 4.1 Code First

299

Nach meinem Verständnis ist das [NotMapped]Attribut erst in EF 5 verfügbar, das sich derzeit in CTP befindet, sodass wir es nicht in der Produktion verwenden können.

Wie kann ich Eigenschaften in EF 4.1 markieren, die ignoriert werden sollen?

UPDATE: Mir ist noch etwas Seltsames aufgefallen. Ich habe das [NotMapped]Attribut zum Laufen gebracht, aber aus irgendeinem Grund erstellt EF 4.1 immer noch eine Spalte mit dem Namen Disposed in der Datenbank, obwohl das public bool Disposed { get; private set; }mit markiert ist [NotMapped]. Die Klasse implementiert IDisposeablenatürlich, aber ich sehe nicht, wie das wichtig sein sollte. Irgendwelche Gedanken?

Raheel Khan
quelle
Es scheint mir, dass dies auch für Entity Framework 4.1 gelten sollte. Überprüfen Sie diesen Link: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte
1
@SamLeach: Ich habe diese Frage bereits gelesen, bevor ich meine eigene gepostet habe, und keine Lösung gefunden. Die Frage ist, wie dies in EF4 erreicht werden kann. Habe ich in diesem Beitrag etwas verpasst?
Raheel Khan
Das habe ich mir auch gedacht, da ich EF 4.1 habe und das Attribut sehen kann. Aber EF scheint ziemlich glücklich zu sein, es in meinen Anwendungen vollständig zu ignorieren. Dies gilt sowohl für native und Referenztypen als auch für com-Referenztypen wie MS Office Intrerop-Anwendungen.
Raheel Khan
Es tut mir leid, aber ich habe gerade einen Test mit einer einfachen Anwendung durchgeführt und es funktioniert. Könnten Sie einen Beispielcode angeben?
Ilmatte

Antworten:

594

Mithilfe der NotMappedAnnotation zu Attributdaten können Sie Code-First anweisen, eine bestimmte Eigenschaft auszuschließen

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]Attribut ist im System.ComponentModel.DataAnnotationsNamespace enthalten.

Sie können dies alternativ mit der Fluent APIüberschreibenden OnModelCreatingFunktion in Ihrer DBContextKlasse tun :

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

Die von mir überprüfte Version EF 4.3ist die neueste stabile Version, die verfügbar ist, wenn Sie NuGet verwenden.


Bearbeiten : SEP 2017

Asp.NET Core (2.0)

Datenanmerkung

Wenn Sie den asp.net-Kern verwenden ( 2.0 zum Zeitpunkt dieses Schreibens ), kann das [NotMapped]Attribut auf Eigenschaftsebene verwendet werden.

public class Customer
{
    public int Id { set; get; }
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
    [NotMapped]
    public int FullName { set; get; }
}

Fließende API

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
quelle
3
Vielen Dank. Es ist immer gut, Antworten mit Mühe dahinter zu sehen. Ich habe Ihre letzte Zeile tatsächlich nicht bemerkt, bevor ich die andere Antwort als richtig markiert habe. Da Ihre Antwort bereits eingegangen ist, halte ich es nur für fair, Ihre zu korrigieren. Ich bin sicher, dass @ilmatte nichts dagegen hat.
Raheel Khan
13
Mit v5> von EF leben diese jetzt in System.ComponentModel.DataAnnotations.Schema
Daveo
Wenn ich FluentMApping verwende, wird das Feld immer noch in der Ergebnismenge zurückgegeben, obwohl es NULL weiß. Wie kann ich erreichen, dass es nicht einmal zurückgegeben wird?
Rodney
8
Wenn Sie [NotMapped] verwenden, werden auch andere Serializer (z. B. JSON / XML) angewiesen, diese Eigenschaft nicht zuzuordnen. Wenn Sie nur die Zuordnung zu einer Datenbanktabelle verhindern möchten, aber dennoch Serializer auf die Eigenschaft zugreifen möchten, müssen Sie den OnModelCreating-Ansatz verwenden.
Maxmantz
Obwohl ich nicht genau herausgefunden habe, wie, funktioniert dies nicht mit Eigenschaften, die auf Entity Framework 6+ geerbt wurden. Das Attribut und die fließende API scheinen die Anweisung zu ignorieren
PBo
35

Ab EF 5.0 müssen Sie den System.ComponentModel.DataAnnotations.SchemaNamespace einschließen .

Shane
quelle
2
Ist das noch der Fall? Ich verwende EF 6.0 und dies ist zumindest für mein Projekt nicht mehr der Fall. Es sei denn, ich habe auf einen Namespace verwiesen, der bereits irgendwo auf den oben genannten verweist.
JARRRRG