Mengabaikan properti kelas di Entity Framework 4.1 Code First

299

Pemahaman saya adalah bahwa [NotMapped]atribut tidak tersedia sampai EF 5 yang saat ini dalam CTP sehingga kami tidak dapat menggunakannya dalam produksi.

Bagaimana saya bisa menandai properti di EF 4.1 diabaikan?

UPDATE: Saya melihat sesuatu yang aneh. Saya mendapatkan [NotMapped]atribut untuk bekerja tetapi untuk beberapa alasan, EF 4.1 masih membuat kolom bernama Disingkirkan dalam database meskipun public bool Disposed { get; private set; }ditandai dengan [NotMapped]. Kelas mengimplementasikan IDisposeabletentu saja tetapi saya tidak melihat bagaimana itu menjadi masalah. Adakah pikiran?

Raheel Khan
sumber
Menurut saya itu harus diterapkan pada Entity Framework 4.1 juga. Periksa tautan ini: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte
1
@ SamLeach: Saya sudah membaca pertanyaan itu sebelum memposting pertanyaan saya sendiri dan tidak menemukan solusi. Pertanyaannya adalah bagaimana mencapai hal yang sama di EF4? Apakah saya melewatkan sesuatu di pos itu?
Raheel Khan
Itulah yang saya pikirkan juga karena saya memiliki EF 4.1 dan dapat melihat atributnya. Tapi EF sepertinya cukup senang mengabaikannya di aplikasi saya. Ini berlaku untuk tipe asli dan referensi serta jenis referensi com seperti aplikasi MS office intrerop.
Raheel Khan
Saya minta maaf tapi saya melakukan tes sekarang dengan aplikasi sederhana dan berfungsi. Bisakah Anda memberikan kode sampel?
ilmatte

Jawaban:

594

Anda dapat menggunakan NotMappedanotasi data atribut untuk menginstruksikan Code-First untuk mengecualikan properti tertentu

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]atribut termasuk dalam System.ComponentModel.DataAnnotations namespace.

Anda juga dapat melakukan ini dengan fungsi Fluent APIutama OnModelCreatingdi DBContextkelas Anda :

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

Versi yang saya periksa adalah EF 4.3, yang merupakan versi stabil terbaru yang tersedia saat Anda menggunakan NuGet.


Edit : SEP 2017

Asp.NET Core (2.0)

Anotasi data

Jika Anda menggunakan inti asp.net ( 2.0 pada saat penulisan ini ), [NotMapped]Atribut dapat digunakan pada tingkat properti.

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 Lancar

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
sumber
3
Terima kasih. Itu selalu baik untuk melihat jawaban dengan upaya di belakang mereka. Saya sebenarnya tidak memperhatikan baris terakhir Anda sebelum menandai jawaban yang lain sebagai benar. Karena jawaban Anda memang masuk sebelumnya, saya pikir itu adil untuk mengubah jawaban Anda untuk mengoreksi. Saya yakin @ilmatte tidak akan keberatan.
Raheel Khan
13
Dengan v5> dari EF sekarang tinggal di System.ComponentModel.DataAnnotations.Schema
Daveo
ketika saya menggunakan FluentMApping, bidang masih dikembalikan di resultset, meskipun NULL tahu. Bagaimana cara mendapatkannya agar tidak dikembalikan?
Rodney
8
Menggunakan [NotMapped] juga akan memberi tahu serialis lain (JSON / XML misalnya) untuk tidak memetakan properti ini. Jika Anda hanya ingin mencegah pemetaan ke tabel database, tetapi masih memiliki serializers mengakses properti, Anda harus menggunakan pendekatan OnModelCreating.
maksmantz
Meskipun saya tidak tahu persis bagaimana caranya, ini tidak bekerja dengan properti yang diwarisi pada kerangka entitas 6+ atribut dan fasih api tampaknya mengabaikan instruksi
PBo
35

Mulai EF 5.0, Anda harus menyertakan System.ComponentModel.DataAnnotations.Schemanamespace.

Shane
sumber
2
Apakah ini masih terjadi? Saya menggunakan EF 6.0 dan ini tidak lagi menjadi masalah setidaknya untuk proyek saya. Kecuali saya sudah mereferensikan namespace yang sudah di suatu tempat referensi di atas.
JARRRRG