Akıcı arayüzler niteliklerden daha esnek mi ve neden?


15

EF 4.1 Kod İlkinde öğreticide aşağıdaki kod verilir:

public class Department
{
    public int DepartmentId { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Collaborator> Collaborators { get; set; }
}

Daha sonra akıcı arayüzün daha esnek olduğu açıklanmıştır:

Veri Ek Açıklamalarının kullanımı kesinlikle kolaydır, ancak çok daha fazla esneklik sağlayan programlı bir yaklaşım kullanılması tercih edilir.

Akıcı arayüzü kullanma örneği daha sonra verilir:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Department>().Property(dp => dp.Name).IsRequired();
    modelBuilder.Entity<Manager>().HasKey(ma => ma.ManagerCode);
    modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .IsConcurrencyToken(true)
        .IsVariableLength()
        .HasMaxLength(20);
}

Akıcı arayüzün neden daha iyi olduğunu anlayamıyorum. Gerçekten mi? Benim bakış açımdan, veri ek açıklamaları daha açık ve daha net bir anlambilim hissine sahip gibi görünüyor.

Sorum şu: Akıcı bir arayüz neden özellikle bu durumda nitelikleri kullanmaktan daha iyi bir seçenek olsun?

(Not: Akıcı arayüzlerin tüm konsepti için oldukça yeniyim, bu yüzden lütfen bu konuda önceden bilgi beklemeyin.)

Referans: http://codefirst.codeplex.com/


Bu soru gerçekten akıcı arayüzlerle ilgili değil. Fark, özniteliklerin kullanımı ile normal kod arasındadır. Kod akıcı olmasaydı, sorunuz hakkında fazla bir şey değişmezdi.
svick

@svick akıcı arayüzler temelde normal koddur, ancak farklı bir şekilde ifade eder. Düz koddaki şeyleri niteliklerden ayırdık, şimdi akıcı arayüzlerle, bazıları geri izliyor ve koddaki şeyleri tekrar belirtmeye doğru ilerliyor gibi görünüyor. Sadece neden öznitelikler yerine kodu kullanacağınızı anlamak istiyorum. Akıcı arayüzler niteliklerden uzaklaşıp her şeyi tekrar kodlamaya geri dönmeyi gerektiriyor mu?
Tjaart

Yanıtlar:


13

Veri ek açıklamaları statiktir, örneğin bu yöntem bildirimi çalışma zamanında değişemez:

  [MinLength(5)]
  [MaxLength(20,ErrorMessage="Le nom ne peut pas avoir plus de 20 caractères")]
  public new string Name { get; set; }

Akıcı arayüz dinamik olabilir:

   if (longNamesEnabled)
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(100);
   }
   else
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(20);
   }

kod bahsetmiyorum özellikleri arasında yeniden kullanılabilir.


2
neden aynı mülkün uzunluğunun (veya başka bir mülkün) çalışma zamanında değişeceğini düşünüyorsunuz?
Yusubov

1
@ElYusubov: Kodlama zamanında alan uzunluğunu bilmediğim senaryolarla başlardım.
Wyatt Barnett

@WyattBarnett: alan uzunluğunun değişken olarak yalnızca alan adı parametreleri bazı servislerden veya harici yazılmamış bir kaynaktan dinamik olarak getirildiğinde bir anlam ifade edebilir. Bununla birlikte, alan özellikleri ile dinamik olarak uğraşmak, savunma kodlama yaklaşımını gerektirecektir.
Yusubov

1
@ElYusubov, uzunluk dışında tam olarak aynı olması gereken iki özelliğe sahip olabilirsiniz, bu yüzden onları dinamik olarak ayarlayan bir işleve geçiririm. Bu yüzden yazar onları daha esnek olarak adlandırdı.
Garrett Hall

1
@ElYusubov, alan uzunluğunu proje ayarlarında app.config veya web.config dosyasına beslenen bir ayar yapabilirsiniz. Daha sonra bir veritabanı alanı uzunluğu değiştiyse, uygulamayı yeniden derlemeden ve yeniden konuşlandırmadan .config dosyasındaki uzunluğu değiştirebilirsiniz.
Kyralessa

8

Bu ifadenin geniş çapta uygulanması gerektiğini düşünmüyorum; Önce Kod'a çok özgüdür. İlk Kod'da veri ek açıklamaları, akıcı API'da bulunan işlevlerin yalnızca bir alt kümesini içerir. Başka bir deyişle, yalnızca akıcı API kullanılarak yapılabilen belirli model yapılandırmaları vardır.

Örneğin, ek açıklamalar kullanılarak belirtilemeyen bazı şeyler şunlardır:

  • DateTime özelliğinin hassasiyeti
  • Sayısal özelliklerin hassasiyeti ve ölçeği
  • Sabit uzunluklu bir String veya Binary özelliği
  • Unicode olmayan bir String özelliği
  • İlişkilerin silindiğinde davranışı
  • Gelişmiş haritalama stratejileri

Şahsen, MVC gibi diğer teknolojiler de bunlardan yararlanabileceğinden, mümkün olduğunca doğrulamayla ilgili veri ek açıklamalarını kullanma eğilimindeyim. Diğer her şey için akıcı API'yı tercih ederim.


Sadece akıcı API kullanılarak neler yapılabileceğine dair bir örnek verebilir misiniz? Neden bu şekilde yapmayı seçtiklerini bilmek de ilginç olurdu. Ben daha geleneksel yöntemler ve varlık çerçeve karşı fleunt API anlamaya çalışıyorum sadece bir örnektir. Neden nitelikleri tercih ettiklerini bilmek istiyorum. Bana göre nitelikler daha doğru ve okunabilir görünüyor.
Tjaart

1
@Tjaart Bazı örnekler ekledim. Bunu tasarlarken iki ana motive edici prensip vardı. İlk olarak, geliştiricilerin seçmesine izin verin. Bazı insanlar nitelikleri POCO'nun ihlali olarak görürken, diğerleri bildirici nitelikleri gibi. İkinci olarak, mevcut özniteliklerden yararlanın ve yalnızca ortak senaryolar için yenilerini tanıtın. Muhtemelen yukarıda verdiğim örneklerin nispeten nadir olduğunu kabul edersiniz.
bricelam

OnDelete davranışının sadece akıcı API'de kullanılabildiğini fark ettim. Neden bu şekilde yapmayı seçtiklerini düşünebiliyor musunuz? Bu gerçekten bu soruyla başa çıkmaya çalışıyorum. Sınıfları projeler arasında paylaşıyorsanız, POCO ihlali iyi bir neden olabilir. Nitelikler kullanıyorsanız, istemediğiniz bir varlık çerçevesi bağımlılığı çekebilirsiniz!
Tjaart

@Tjaart, tam nedenlerini hatırlamıyorum. Ekibe İlk Kod özelliğinin sonuna doğru katıldım ve tasarımı için burada değildim. Yine de ekipten birisinin daha tartmasına izin verip veremeyeceğimi göreceğim.
bricelam

1

Sorunuzun yanıtı bağlantıda verilmiştir.

Ardından alan adınız için geçerli olan kısıtlamalarınızı bu yöntemle programlı olarak tanımlarsınız.

Temel olarak, programsal yaklaşımın işletme üzerinde daha fazla kontrole sahip olduğu Nitelikler ile programlı yaklaşımın kullanılması az çok tercih edilir. Ancak, modelinizi süslemek için de bakabileceğiniz özel bir özellik eklemenin yolu vardır.

Bu yaklaşımı kullanırken tablolar ve sütunlar arasındaki ilişkileri bile tanımlayabilirsiniz. Sonuç olarak, alan adınız üzerinde daha fazla ince taneli kontrole sahip olmak istiyorsanız, EF4.1 ile birlikte gelen bu yeni yaklaşımı kullanabilirsiniz.

Bununla birlikte, yaygın doğrulama senaryoları için, Niteliklerin uygulanması, çoğu durumu kapsayacak şekilde sağlam olduğu için iyi çalışmalıdır; ayrıca size zaman kazandırabilir.


Programatik yolun size nasıl daha fazla kontrol sağladığını gösterebilir misiniz? Bu noktada gerçekten anlamıyorum.
Tjaart

Örneğin, bunu ".IsConcurrencyToken (true)" olarak ele alın - bunu bir Nitelik tanımında nasıl yapardınız?
Yusubov

[ConcurrencyCheck] <- aslında daha basit görünüyor
Tjaart

iyi yakalama, daha sonra "tablolar ve sütunlar arasındaki ilişkileri" nasıl tanımlarsınız?
Yusubov

[ForeignKey ("PersonId")] <- bunun gibi, muhtemelen .HasForeignKey (t => t.ProjectId) kadar basit değildir, ancak gerekli olan her şey ForeignKey () 'in akıcı arayüz gibi bir lambda almasına izin vermektir. Hala neden diğerinden daha iyi olduğunu açıklamıyor.
Tjaart

0

Benim düşüncem, ilişkilerin veritabanında nasıl oluşturulduğunu açıkladığınız için kod ilk uygulamaları için akıcı API'yi önermeleri. Veri ek açıklamaları kullanırsanız, Entity Framework tarafından oluşturulan veritabanı beklediğiniz gibi olmayabilir. İlk örneğiniz çok basit, bu yüzden sizin gibi veri açıklama yöntemini kullanacağım.


Veritabanının beklediğiniz gibi olmadığına ve akıcı bir arayüzün bunun olmasını nasıl önlediğine bir örnek verebilir misiniz?
Tjaart
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.