Datenmodell unter EF richtig umgesetzt?

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Datenmodell unter EF richtig umgesetzt?

    Hallo,

    ich habe mich gerade in EntityFramework eingearbeitet.
    Nun will ich meine erste Anwendung programmieren, bin mir aber in der Umsetzung noch sehr unsicher.
    Hier ist mal mein Datenmodell, was ich auffgestellt habe:


    Ich denke, dass ist soweit erklärend, wenn nicht einfach fragen.

    Im Anhang befindet sich mein EF Projekt.
    Bis jetzt habe ich erst die Models und die OnModelCreating Methode aus der Klasse DbContext geschrieben, in der ich auch die Beziehungen und Fremdschlüssel festlege.

    Ich würde mich über ein kleines Feedback freuen, ob ich soweit alles richtig umgesetzt habe, oder ob ich noch einen wichtigen Punkt vergessen habe.

    Viele Grüße
    Florian
    Dateien
    ----

    WebApps mit C#: Blazor
    Hallo Florian

    Also für mich sieht das gut aus. Lediglich List würde ich vieleicht unbenennen. Du weist sicher was List ist aber ich könnte mir unter List jetzt nichts vorstellen. Vieleicht einen besseren Namen wählen.

    Ich würde nur auf jeden Fall per DataAnnotations Dinge wie DefaultValue, Key, StringLengt, MinValue, MaxValue, Required usw. einpflegen.
    So kann es dir erst gar nicht passieren das z.b. ein Album ohne einem Albumnamen gespeichert werden kann. EF sorgt dafür das die per DataAnnation angegebenen Wert auf dem Relationellen Datenmodell eingetragen werden wodurch das Datenbanksystem solch einen Speicherversuch sofort zurückweist und dir ein solcher "Fehler" um die Ohren fliegt.

    z.b.:

    C#-Quellcode

    1. public class Album : ModelBase
    2. {
    3. //PK
    4. [Key]
    5. public int AlbumID { get; set; }
    6. //Other
    7. [Required(AllowEmptyStrings = false,ErrorMessage ="{0} ist ein Pflichtfeld!")]
    8. [StringLength(50,ErrorMessage = "Das Feld '{0}' darf nicht mehr als '{1}' Zeichen und nicht weniger als '{2}' Zeichen haben.",MinimumLength = 2)]
    9. public string Name { get; set; }
    10. //
    11. public List<Song> Songs { get; set; }
    12. }


    Weiters vieleicht im OnModelCreating die Indizes gleich festlegen, das holt nochmals Performance raus:

    C#-Quellcode

    1. modelBuilder.Entity<Album>().HasIndex(i => i.Name).IsUnique(true);


    Hoffe das hilft dir.

    PS: Nachtrag. Fast vergessen. In der Contextklasse fehler noch die DBSet Properties. Für jede Tabelle die EF anlegen soll muss es ein solches Property geben. Die Einzige Ausnahme wäre die N:M Zwischentabelle, die legt EF von selbst an durch die Konfiguration über die Fluent API. Aber es schadet nicht dieses Property trotzdem zu erstellen (explizit) da es einem Helfen kann wenn man eine ID parat hat und direkt darauf zugreifen kann.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo,

    erstmal vielen Dank für dein Feedback.

    Nofear23m schrieb:

    In der Contextklasse fehler noch die DBSet Properties.

    Oh, hab ich vergessen. Das hätte einen Fehler gegeben, nachdem ich wieder ewig gesucht hätte.

    Nofear23m schrieb:

    Weiters vieleicht im OnModelCreating die Indizes gleich festlegen, das holt nochmals Performance raus:

    Da ist das Problem, dass ich mich in den Datenbanken zu wenig auskenne, und nicht genau weiß, wann man wo einen Indiez setzt.

    Nofear23m schrieb:

    Ich würde nur auf jeden Fall per DataAnnotations Dinge wie DefaultValue, Key, StringLengt, MinValue, MaxValue, Required usw. einpflegen.

    Sehr sinnfoll, allerdings muss ich dann das EntityFramework Package auch in das ModelProjekt installieren, damit ich diese zu Verfügung habe. Ich wusste nicht ob das so gut ist.

    Was ich noch fragen wollte ist folgendes:
    In deinen Beispielprojekt mit EntityFramework (ich glaube WPFNotes hieß es) steht in deiner OnModelCreating Methode gar nichts.
    Liegt das daran, dass die Datenbank bereits existiert, oder hast du die FluentAPI Funktionen irgendwo anders gelagert?

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor

    florian03 schrieb:

    allerdings muss ich dann das EntityFramework Package auch in das ModelProjekt installieren

    Nene, nur DataAnnotations. Gibts auch ein NuGet Packet für .Net Standard und .Net Core. Bitte (wie du richtig sagst) keinen Verweis auf EF. Nur lediglich der DataAnnotation Namespace wird benötigt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,

    ich wollte nochmal nachfragen:
    Ist es "egal" ob ich die Punkte mit der FluentAPI konfiguriere oder mit DataAnnotations? Und was "zählt" im Zweifel mehr?

    Viele Grüße
    Florian

    PS: Und ich glaube du hast mir vergessen meine eine Frage aus dem letzten Post zu beantworten.
    ----

    WebApps mit C#: Blazor
    Hallo

    Ja, es ist egal "wie" du es machst. Üblicherweise entscheidet man sich aber auf jedenfall für eine Methode. Einfach wegen der Übersichtlichkeit. Nicht das du ein paar DefaultValues über Annotation und ein paar über die FluetAPI konfigurierst. Das verlierst du den Überblick. Wenn ich weis - OK, ich mache dies oder jenes immer über die FluentAPI weis ich wo ich nachsehen muss. Ausserdem könnte es sonst ja passieren das du über die Annoationen einen Wert definierst und über die FluentAPI einen anderen und dann wunderst du dich. Das bringt mich zum nächsten Punkt.

    Als erstes greift mal die Konvention. Also das was sich EF von selbst "denkt". z.b. wenn in der Klasse "Song" eine Eigenschaft "ID" oder "SingID" benannt wurde sagt EF einfach - OK, das ist der PrimaryKey. Ist übrigens nicht CaseSensitive.

    Die DataAnnotation überschreibt die Konvention, also die logik von EF. Und die FluentAPI überschreibt alles. Die FluentAPI ist also als letztes dran und wird somit IMMER hergenommen.

    Sorry, habe die letzte Frage übersehen.
    Ja, ich hatte nichts in Verwendung was ein eingreifen über die FluentAPI erforderlich gemacht hätte, den Rest habe ich über die Annotation gemacht, insofern ist hier kein Code drinnen.
    In deinem Fall wäre es auch nur die N:M Beziehung und evtl. Indizes welche über die FluentAPI gemacht werden müssten. Bei EF 6 konnte man Indices sogar über die Annotationen definieren, leider unter EF Core nicht. (Im Moment)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##