Kode Kerangka Kerja Entitas Pertama - Keuntungan dan kerugian dari Api Lancar vs Anotasi Data [ditutup]

120

Saat membuat database menggunakan kode pertama Entity Framework, banyak model database yang dapat diekstrak dari kode. Fluent API dan / atau Attributes dapat digunakan untuk menyempurnakan model.

Apa kelebihan dan kekurangan Fluent Api dibandingkan dengan Anotasi Data? Dengan kata lain: Bahkan jika dalam situasi tertentu kedua metode dapat digunakan, dalam kasus apa satu metode harus lebih unggul dari yang lain?

Sam
sumber
3
Hanya sebuah ide: Yang biasanya saya lakukan adalah membuat proyek Model dengan POCO saya, dan kemudian di proyek Repositori, buat satu set POCO baru khusus untuk EF, dan letakkan penjelasan saya di sana. Lalu saya hanya memetakan di antara keduanya di kelas mapper. Dengan cara itu, model saya tetap tidak tersentuh, dan membuatnya mudah untuk menambah / mengubah strategi data saya, jika perlu (misalnya menambahkan XmlRepository dan menggunakan kelas Model yang sama).
adimauro
1
Saya sekarang lebih suka Anotasi, dengan EFCore dan perpustakaan tambahan. (memerlukan lebih sedikit kode, dan semua ada di satu tempat) github.com/isukces/EfCore.Shaman - menambah dan memperluas atribut github.com/borisdj/EFCore.FluentApiToAnnotation - berguna ketika DB sudah ada, setelah melakukan Rekayasa Balik dan beralih ke CodeFirst
borisdj

Jawaban:

141

Segala sesuatu yang dapat Anda konfigurasikan dengan DataAnnotations juga dimungkinkan dengan Fluent API. Kebalikannya tidak benar. Jadi, dari sudut pandang opsi konfigurasi dan fleksibilitas, Fluent API "lebih baik".

Contoh konfigurasi (pasti bukan daftar lengkap) yang mungkin dilakukan di Fluent API tetapi tidak dengan DataAnnotations (sejauh yang saya lihat):

  • Matikan penghapusan berjenjang:

    .WillCascadeOnDelete(false)

  • Tentukan nama kolom kunci asing di database saat kunci tidak diekspos dalam model objek Anda:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • Penyetelan relasi yang terperinci, terutama dalam semua kasus di mana hanya satu sisi asosiasi yang diekspos dalam model objek:

    .WithMany(...), WithOptional(...), WithRequiredDependent(...),WithRequiredPrincipal(...)

  • Spesifikasi pemetaan warisan antara model objek dan tabel database (Tabel-Per-Hirarki, Tabel-Per-Jenis, Tabel-Per-Kelas Beton):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

Sunting: Microsoft menganggap Fluent API sebagai "fitur lanjutan" (Kutipan dari sini ):

Fluent API dianggap sebagai fitur yang lebih canggih dan kami akan merekomendasikan penggunaan Anotasi Data kecuali persyaratan Anda mengharuskan Anda menggunakan API yang lancar.

Tetapi menurut saya Anda mencapai batasan DataAnnotations dengan sangat cepat (kecuali mungkin untuk model objek yang sangat sederhana). Jika Anda tidak dapat lagi menyempurnakan model Anda dengan DataAnnotations, pilihan terakhir Anda adalah mengikuti konvensi pemetaan default (dengan menamai properti Anda sesuai dengan aturan tersebut). Saat ini Anda tidak dapat menimpa konvensi (hanya menonaktifkannya; MS mengumumkan untuk memberikan opsi konfigurasi untuk konvensi di rilis EF mendatang). Namun jika Anda tidak ingin dipaksa oleh konvensi pemetaan saat Anda mendefinisikan model objek, satu-satunya pilihan Anda adalah Fluent API.

Mempelajari Fluent API hampir merupakan suatu keharusan, DataAnnotations bagus untuk dimiliki untuk aplikasi sederhana.

Slauma
sumber
2
Saya seorang pemula di bidang ini. Dapatkah Fluent API digunakan untuk memvalidasi antarmuka pengguna seperti yang dapat dilakukan DataAnnotation?
cium ketiak saya
27
@CounterTerrorist: Saya rasa tidak. Sebagai contoh: Jika Anda meletakkan [Required]atribut pada properti dalam aplikasi ASP.NET MVC itu akan digunakan baik oleh EF dan oleh MVC untuk tujuan validasi karena keduanya dapat memproses atribut ini. Tetapi MVC tidak akan memahami konfigurasi API Lancar. Jadi, jika Anda menghapus atribut dan menggunakannya HasRequireddi Fluent API, untuk EF akan sama tetapi tidak untuk MVC. (Menurut pendapat saya, atribut harus diberi nama yang berbeda, penggunaan namespace DataAnnotations dari berbagai komponen dan untuk tujuan yang berbeda sangat membingungkan.)
Slauma
4
Perhatikan [DefaultValue()]juga tidak mungkin di Fluent Either.
webnoob
4
MinValue adalah atribut yang tidak dapat didefinisikan melalui Fluent API (Programming Entity Framework: Code First) (sumber: NAA dihapus oleh The Cog )
Serge Ballesta
7
Dari sudut pandang arsitektural, saya kira Fluent APIakan menjaga logika implementasi Anda DbContextdan menjaga POCOkebersihan Anda
Luke T O'Brien