Entity Framework Code First - Fluent Api ile Veri Ek Açıklamalarının avantajları ve dezavantajları [kapalı]


120

Entity Framework kodunu kullanarak bir veritabanı oluştururken, veritabanı modelinin çoğu koddan çıkarılabilir. Akıcı API ve / veya Nitelikler, modelin ince ayarını yapmak için kullanılabilir.

Veri Ek Açıklamaları ile karşılaştırıldığında Fluent Api'nin avantajları ve dezavantajları nelerdir? Başka bir deyişle: Belirli durumlarda her iki yöntem de kullanılabilse bile, hangi durumlarda bir yöntem diğerine üstün gelmelidir?


3
Sadece bir fikir: Genellikle yaptığım şey, POCO'larımla bir Model projesi oluşturmak ve ardından Depo projesinde, özellikle EF için yeni bir POCO seti oluşturmak ve ek açıklamalarımı oraya koymaktır. Sonra haritacı sınıflarında ikisi arasında haritalama yaparım. Bu şekilde, modelim dokunulmadan kalır ve gerekirse veri stratejimi eklemeyi / değiştirmeyi kolaylaştırır (örneğin, bir XmlRepository ekleyin ve aynı Model sınıflarını kullanın).
adimauro

1
Şimdi EFCore ve ek kütüphanelerle Annotation'ı tercih ediyorum. (daha az kod gerektirir ve hepsi tek bir yerde bulunur) github.com/isukces/EfCore.Shaman - öznitelikleri ekler ve genişletir github.com/borisdj/EFCore.FluentApiToAnnotation - Tersine Mühendislik yaptıktan ve CodeFirst
borisdj

Yanıtlar:


142

DataAnnotations ile yapılandırabileceğiniz her şey Fluent API ile de mümkündür. Bunun tersi doğru değil. Bu nedenle, yapılandırma seçenekleri ve esneklik açısından Fluent API "daha iyidir".

Fluent API'de mümkün olan ancak DataAnnotations ile mümkün olmayan (görebildiğim kadarıyla) konfigürasyon örnekleri (elbette tam bir liste değil):

  • Basamaklı silme işlemlerini kapatın:

    .WillCascadeOnDelete(false)

  • Anahtar nesne modelinizde gösterilmediğinde veritabanında yabancı anahtar sütun adını belirtin:

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

  • Özellikle nesne modelinde bir ilişkilendirmenin yalnızca bir tarafının açığa çıktığı tüm durumlarda, ilişkilerin ince granüler ayarı:

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

  • Nesne modeli ve veritabanı tabloları arasında miras eşleştirmesinin belirlenmesi (Hiyerarşi Başına Tablo, Tür Başına Tablo, Sınıf Başına Tablo):

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

Düzenleme: Microsoft, Fluent API'yi "gelişmiş bir özellik" olarak kabul eder (Alıntıyı buradan alın ):

Akıcı API daha gelişmiş bir özellik olarak kabul edilir ve gereksinimleriniz akıcı API kullanmanızı gerektirmediği sürece Veri Ek Açıklamalarını kullanmanızı öneririz.

Ancak bence DataAnnotations'ın sınırlamalarına çok hızlı bir şekilde ulaşırsınız (belki de son derece basit nesne modelleri hariç). Modelinizi DataAnnotations ile artık ince ayarlayamıyorsanız, son çare varsayılan eşleme kurallarını izlemektir (özelliklerinizi bu kurallara göre adlandırarak). Şu anda kuralların üzerine yazamazsınız (yalnızca onları devre dışı bırakın; MS, gelecekteki EF sürümlerinde kurallar için yapılandırma seçenekleri sunacağını duyurdu). Ancak, nesne modelinizi tanımlarken eşleme kuralları tarafından zorlanmak istemiyorsanız, tek seçeneğiniz Fluent API'dir.

Fluent API'yi öğrenmek neredeyse bir zorunluluktur, DataAnnotations basit uygulamalar için olması güzeldir.


2
Ben bu alanda acemiyim. Fluent API, DataAnnotation'ın yapabileceği gibi kullanıcı arayüzlerini doğrulamak için kullanılabilir mi?
koltuk altımı öp

27
@CounterTerrorist: Sanmıyorum. Örneğin: koyarsanız [Required]bir ASP.NET MVC uygulamasında bir mülk üzerinde niteliği o EF tarafından hem kullanılacaktır ve her ikisi de bu niteliği işleyebilir çünkü doğrulama amaçlı MVC tarafından. Ancak MVC, Fluent API yapılandırmasını anlamaz. Öyleyse, özniteliği kaldırır ve HasRequiredbunun yerine Fluent API'de kullanırsanız, EF için aynı olacaktır ancak MVC için olmayacaktır. (Bana göre öznitelikler farklı adlandırılmış olmalıydı, DataAnnotations ad alanının farklı bileşenlerden ve farklı amaçlar için kullanılması çok kafa karıştırıcı.)
Slauma

4
Ayrıca [DefaultValue()], Fluent'te de mümkün olmadığını unutmayın .
webnoob

4
MinValue Akıcı API üzerinden tanımlanamaz bir niteliktir (Entity Framework Programlama: Kod İlk) (kaynak: tarafından NAA silinen Cog )
Serge Ballesta

7
Mimari açıdan bakıldığında, Fluent APIuygulama mantığınızı sizin için DbContextve POCOtemiz tutmanız gerektiğini tahmin ediyorum
Luke T O'Brien
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.