betrifft: EntityFrameworkCore
Hallo,
ich versuche gerade komplett von DataAnnotations wegzukommen und meine Datenbank mit Hilfe von fluent Api zu konfigurieren.
Ich habe mich jetzt hauptsächlich auf entityframeworkcore.com, www.entityframeworktutorial.net und www.learnentityframeworkcore.com gestürzt.
Am besten ich zeige euch erst mal mein Data-Model und dann meine Fragen.
Ich kürze es ein wenig, weil es im Wesentlichen um das Verständnis geht (die Beispiele findet man so auch in etwa auf den vorgenannten Sites):
nehmen wir mal eine Schulklasse und einen Schüler:
public class SchoolClass
{
public int SchoolClassId {get;set;}
// ... noch ein paar Properties
public List<Students> Students {get;set;}
}
public class Student
{
public int StudentId {get;set;}
public Person PersonData {get;set;}
public Address AddressData {get;set;}
public Education EducationData {get;set,}
}
public class Person
{
public int PersonId {get;set;}
//...Properties wie Vorname, Nachname, Geburtsdatum, Geburtsort...etc.
}
public class Address
{
public int AddressId {get;set;}
//...Properties wie Straße, Hausnummer, Wohnort, Postleitzahl, etc.
}
public class Education
{
public int EducationId {get;set;}
//...Properties wie Schulform, Datum Schuleintritt, Klassenstufe, etc.
}
Nichts spannendes soweit. Wenn ich nun meinen DataContext so belasse...
public class DataBaseContext : DbContext
{
public DbSet<SchoolClass> SchoolClasses { get; set; }
public DbSet<Student> Students { get; set; }
public DbSet<Person> Persons { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Education> Educations { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//optionsBuilder.UseSqlite("Data Source=Test_lite.sqlite");
optionsBuilder.UseSqlite(connectionString: "FileName =./Test_DataBase.sqlite");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
...dann erstellt mir Entitiframeworkcore eine Datenbank mit den Tables SchoolClasses, Students, Persons, Addresses und Educations. In jedem Table werden außerdem Columns für die ForeignKeys erstellt, um die Objekt-Relationen abzubilden. Soweit so gut.
Nun möchte ich wie gesagt einige Eigenschaften konkretisieren. Ich möchte z. B. meiner Student-Klasse noch drei Properties vom Typ int hinzufügen:
public int PersonKey
public int AddressKey
public int EducationKey
Diese möchte ich im Code auslesen können, um z. B. ganz gezielt Informationen aus der Datenbank abfragen zu können - dazu müsste ich doch im ModelBuilder deklarieren, dass der ForeignKey z. B. PersonKey sein soll, oder? Nur
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasForeignKey() //<-- funktioniert bei mir nicht, diesen Eintrag bekomme ich
durch Intellisense nicht vorgeschlagen, bzw. wir als Fehler
angezeigt.
}
Ich bin mir nicht sicher, warum das nicht funktioniert - wenn ich mir die Beispiele auf den erwähnten Sites so ansehe, kommt mir allerdings der Verdacht, dass ich ein Navigation-Property benötige.
Dessen Funktion ist mir im Prinzip klar, allerdings verstehe ich nicht, wie sich das auf meinen Code auswirkt, denn:
public class Student
{
public int StudentId {get;set;}
public int SchoolClassId {get;set;}
public SchoolClass AssignedSchoolClass {get;set;}
}
//Beispiel hier anhand der Person-Klasse
public class Person
{
public int PersonId {get;set;}
public int StudentId{get;set;}
public Student AssignedStudent {get;set;}
}
Was ich jetzt nicht so ganz kapiere: in meinem Daten-Model ist jetzt in der Person-Klasse plötzlich ein Objekt vom Typ Schüler - und dieses besitzt ja wiederum ein Person-Property und dieses ... immer so weiter. Ebenso in der Student-Klasse: ein SchoolClass-Objekt, das ja wiederum eine List<Student> enthält. Soll das so sein?
Im Prinzip müsste es doch so sein, dass mein Navigation-Property im Code gar nicht auftaucht (denn dort wird es ja auch nicht gebraucht) - aber andererseits muss es ja da sein, damit ich es als Navigation-Property nutzen kann (denn für den DataContext wird es ja gebraucht).
So ganz bin ich mir noch nicht sicher, wie das läuft - ich hoffe, ihr könnt mir das etwas einfacher erklären :)
Gruß
Vorph