Entity Framework Code First - Vor- und Nachteile von Fluent Api gegenüber Datenanmerkungen [geschlossen]

118

Wenn Sie eine Datenbank mit Entity Framework Code-First erstellen, kann ein Großteil des Datenbankmodells aus dem Code extrahiert werden. Fließende API und / oder Attribute können zur Feinabstimmung des Modells verwendet werden.

Was sind die Vor- und Nachteile von Fluent Api im Vergleich zu Datenanmerkungen? Mit anderen Worten: Auch wenn in bestimmten Situationen beide Methoden angewendet werden können, in welchen Fällen sollte sich eine Methode über die andere durchsetzen?

Sam
quelle
3
Nur eine Idee: Normalerweise erstelle ich mit meinen POCOs ein Modellprojekt und erstelle dann im Repository-Projekt einen neuen Satz von POCOs speziell für EF und füge dort meine Anmerkungen ein. Dann ordne ich einfach die beiden in Mapper-Klassen zu. Auf diese Weise bleibt mein Modell unberührt und erleichtert das Hinzufügen / Ändern meiner Datenstrategie, falls erforderlich (z. B. Hinzufügen eines XmlRepository und Verwenden derselben Modellklassen).
Adimauro
1
Ich bevorzuge jetzt Annotation mit EFCore und zusätzlichen Bibliotheken. (erfordert weniger Code und alles befindet sich an einem Ort) github.com/isukces/EfCore.Shaman - Attribute hinzufügen und erweitern github.com/borisdj/EFCore.FluentApiToAnnotation - nützlich, wenn DB bereits vorhanden ist, nachdem Reverse-Engineering durchgeführt und auf gewechselt wurde CodeFirst
borisdj

Antworten:

140

Alles, was Sie mit DataAnnotations konfigurieren können, ist auch mit der Fluent-API möglich. Das Gegenteil ist nicht der Fall. Unter dem Gesichtspunkt der Konfigurationsoptionen und der Flexibilität ist die Fluent-API also "besser".

Konfigurationsbeispiele (sicher keine vollständige Liste), die in der Fluent-API möglich sind, aber nicht mit DataAnnotations (soweit ich sehen kann):

  • Kaskadierende Löschvorgänge ausschalten:

    .WillCascadeOnDelete(false)

  • Geben Sie den Namen der Fremdschlüsselspalte in der Datenbank an, wenn der Schlüssel in Ihrem Objektmodell nicht verfügbar ist:

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

  • Feinabstimmung der Beziehungen, insbesondere in allen Fällen, in denen nur eine Seite einer Assoziation im Objektmodell verfügbar ist:

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

  • Spezifikation der Vererbungszuordnung zwischen Objektmodell und Datenbanktabellen (Tabelle pro Hierarchie, Tabelle pro Typ, Tabelle pro Betonklasse):

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

Bearbeiten: Microsoft betrachtet die Fluent-API als "erweiterte Funktion" (Zitat von hier ):

Die fließende API wird als erweiterte Funktion angesehen. Wir empfehlen die Verwendung von Datenanmerkungen, es sei denn, Ihre Anforderungen erfordern die Verwendung der fließenden API.

Aber meiner Meinung nach erreichen Sie die Grenzen von DataAnnotations sehr schnell (außer vielleicht bei extrem einfachen Objektmodellen). Wenn Sie Ihr Modell nicht mehr mit DataAnnotations optimieren können, müssen Sie als letztes die Standardzuordnungskonventionen befolgen (indem Sie Ihre Eigenschaften gemäß diesen Regeln benennen). Derzeit können Sie die Konventionen nicht überschreiben (nur deaktivieren; MS hat angekündigt, Konfigurationsoptionen für die Konventionen in zukünftigen EF-Versionen anzugeben). Wenn Sie sich jedoch beim Definieren Ihres Objektmodells nicht von den Zuordnungskonventionen zwingen lassen möchten, ist die Fluent-API Ihre einzige Option.

Das Erlernen der Fluent-API ist fast ein Muss. Die DataAnnotations sind ein Muss für einfache Anwendungen.

Slauma
quelle
2
Ich bin ein Neuling auf diesem Gebiet. Kann die Fluent API verwendet werden, um Benutzeroberflächen zu validieren, wie dies DataAnnotation kann?
Küssen Sie meine Achselhöhle
26
@CounterTerrorist: Das glaube ich nicht. Beispiel: Wenn Sie das [Required]Attribut einer Eigenschaft in einer ASP.NET MVC-Anwendung hinzufügen, wird es sowohl von EF als auch von MVC zu Validierungszwecken verwendet, da beide dieses Attribut verarbeiten können. MVC versteht die Fluent API-Konfiguration jedoch nicht. Wenn Sie also das Attribut entfernen und HasRequiredstattdessen in Fluent API verwenden, ist es für EF dasselbe, jedoch nicht für MVC. (Meiner Meinung nach sollten die Attribute unterschiedlich benannt worden sein, die Verwendung des DataAnnotations-Namespace aus verschiedenen Komponenten und für verschiedene Zwecke ist sehr verwirrend.)
Slauma
3
Beachten Sie auch, [DefaultValue()]dass Fluent entweder nicht möglich ist.
Webnoob
3
MinValue ist ein Attribut, das nicht über die Fluent API (Programming Entity Framework: Code First) definiert werden kann (Quelle: NAA von The Cog gelöscht )
Serge Ballesta
7
Aus architektonischer Sicht Fluent APIwürde ich Ihre Implementierungslogik in Ihrer DbContextbehalten und Ihre POCOs sauber halten
Luke T O'Brien