Le interfacce fluenti sono più flessibili degli attributi e perché?

14

In un codice EF 4.1 Primo tutorial viene fornito il seguente codice:

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

Quindi viene spiegato che l'interfaccia fluente è più flessibile:

Data Annotations are definitely easy to use but it is preferable to use a programmatic approach that provides much more flexibility.

Viene quindi fornito l'esempio di utilizzo dell'interfaccia fluente:

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);
}

Non riesco a capire perché l'interfaccia fluente sia presumibilmente migliore. É davvero? Dal mio punto di vista, sembra che le annotazioni dei dati siano più chiare e abbiano un aspetto semantico pulito.

La mia domanda è: perché un'interfaccia fluente può essere un'opzione migliore rispetto all'utilizzo di attributi, specialmente in questo caso?

(Nota: sono abbastanza nuovo per l'intero concetto di interfacce fluenti, quindi per favore non aspettatevi conoscenze precedenti su questo.)

Riferimento: link

    
posta Tjaart 01.08.2012 - 16:19
fonte

4 risposte

12

Le annotazioni dei dati sono statiche, ad esempio questa dichiarazione del metodo non può cambiare in fase di esecuzione:

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

L'interfaccia fluente può essere dinamica:

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

per non parlare del codice può essere riutilizzato tra le proprietà.

    
risposta data 01.08.2012 - 19:21
fonte
8

Non penso che questa affermazione debba essere applicata in senso lato; è molto specifico per Code First. In Code First, le annotazioni dei dati includono solo un sottoinsieme della funzionalità disponibile nell'API fluente. In altre parole, ci sono alcune configurazioni del modello che possono essere fatte solo usando l'API fluente.

Ad esempio, ecco alcune delle cose che non possono essere specificate usando le annotazioni:

  • Precisione di una proprietà DateTime
  • La precisione e la scala delle proprietà numeriche
  • Una proprietà String o Binary di lunghezza fissa
  • Una proprietà String come non Unicode
  • Il comportamento on-delete delle relazioni
  • Strategie di mappatura avanzate

Personalmente, tendo ad usare le annotazioni dei dati relative alla convalida quando possibile, poiché anche altre tecnologie come MVC possono trarne vantaggio. Per tutto il resto, preferisco l'API fluente.

    
risposta data 02.08.2012 - 00:05
fonte
1

La risposta alla tua domanda è fornita nel link.

Then you define your constraints applicable to your domain within this method programmatically.

Fondamentalmente, è più o meno preferibile utilizzare gli attributi rispetto all'approccio programmatico, in cui l'approccio programmatico ha un maggiore controllo sull'entità. Tuttavia, esiste un modo personalizzato di aggiungere attributi per decorare il tuo modello che potresti avere anche.

When using this approach you may even describe relations between tables and columns. Bottom line, if you are willing to have more fine-grain control over your domain you may use this new approach that comes with EF4.1.

Tuttavia, per gli scenari comuni di convalida l'applicazione degli attributi dovrebbe funzionare bene perché è robusto per coprire la maggior parte dei casi; e inoltre potrebbe farti risparmiare tempo.

    
risposta data 01.08.2012 - 16:35
fonte
0

Il mio pensiero è che raccomandano l'API fluente per le implementazioni del codice prima perché descrivi esplicitamente come vengono create le relazioni nel database. Se si utilizzano annotazioni di dati, il database creato da Entity Framework potrebbe non essere quello che ci si aspetta. Il tuo esempio iniziale è molto semplice quindi, come te, utilizzerei semplicemente il metodo di annotazione dei dati.

    
risposta data 01.08.2012 - 16:53
fonte

Leggi altre domande sui tag