- Artikel
Eins-zu-viele-Beziehungen werden verwendet, wenn eine einzelne Entität mit einer beliebigen Anzahl anderer Entitäten verknüpft ist. Zum Beispiel einBlog
kann viele verbunden habenBeiträge
, aber jederPost
ist nur mit einem verbundenBlog
.
Dieses Dokument ist anhand zahlreicher Beispiele aufgebaut. Die Beispiele beginnen mit häufigen Fällen, in denen auch Konzepte vorgestellt werden. Spätere Beispiele behandeln weniger häufige Konfigurationsarten. Ein guter Ansatz besteht darin, die ersten paar Beispiele und Konzepte zu verstehen und dann basierend auf Ihren spezifischen Anforderungen mit den späteren Beispielen fortzufahren. Basierend auf diesem Ansatz beginnen wir mit einfachen „erforderlichen“ und „optionalen“ Eins-zu-viele-Beziehungen.
Tipp
Den Code für alle folgenden Beispiele finden Sie inOneToMany.cs.
Eins-zu-viele erforderlich
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft public Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
Eine Eins-zu-Viele-Beziehung besteht aus:
- Ein oder mehrPrimär- oder AlternativschlüsselEigenschaften des Hauptunternehmens; das ist das „eine“ Ende der Beziehung. Zum Beispiel,
Blog.ID
. - Ein oder mehrUnbekannter SchlüsselEigenschaften der abhängigen Entität; Das ist das „viele“ Ende der Beziehung. Zum Beispiel,
Post.BlogId
. - Optional, aSammlungsnavigationauf der Hauptentität, die auf die abhängigen Entitäten verweist. Zum Beispiel,
Blogeinträge
. - Optional, aReferenznavigationauf der abhängigen Entität, die auf die Hauptentität verweist. Zum Beispiel,
Post.Blog
.
Also für die Beziehung in diesem Beispiel:
- Die Fremdschlüsseleigenschaft
Post.BlogId
ist nicht nullbar. Dies macht die Beziehung „erforderlich“, da jede abhängige (Post
)muss mit einem Auftraggeber zusammenhängen(Blog
), da seine Fremdschlüsseleigenschaft auf einen bestimmten Wert gesetzt werden muss. - Beide Entitäten verfügen über Navigationen, die auf die entsprechende(n) Entität(en) auf der anderen Seite der Beziehung verweisen.
Notiz
Eine erforderliche Beziehung stellt sicher, dass jede abhängige Entität mit einer Hauptentität verknüpft sein muss. Ein Hauptunternehmen kann jedochstetsexistieren ohne abhängige Einheiten. Das heißt, bei einer erforderlichen Beziehung ist dies der Fallnichtgeben an, dass es immer mindestens eine abhängige Entität geben wird. Im EF-Modell und auch in einer relationalen Datenbank gibt es keine Möglichkeit, sicherzustellen, dass ein Prinzipal einer bestimmten Anzahl von Abhängigen zugeordnet ist. Wenn dies erforderlich ist, muss es in der Anwendungslogik (Geschäftslogik) implementiert werden. SehenErforderliche Navigationenfür mehr Informationen.
Tipp
Eine Beziehung mit zwei Navigationen, eine vom abhängigen zum Hauptelement und eine umgekehrte vom Hauptelement zum abhängigen Element, wird als bidirektionale Beziehung bezeichnet.
Diese Beziehung istdurch Konvention entdeckt. Das ist:
Blog
wird als Hauptperson in der Beziehung entdeckt undPost
wird als abhängig entdeckt.Post.BlogId
wird als Fremdschlüssel des abhängigen Schlüssels entdeckt, der auf den verweistBlog.ID
Primärschlüssel des Prinzipals. Die Beziehung wird nach Bedarf ermittelt, weilPost.BlogId
ist nicht nullbar.Blogeinträge
wird als Sammlungsnavigation erkannt.Post.Blog
wird als Referenznavigation erkannt.
Wichtig
Beim BenutzenC#-Nullable-Referenztypen, muss die Referenznavigation NULL-fähig sein, wenn die Fremdschlüsseleigenschaft NULL-Werte zulässt. Wenn die Fremdschlüsseleigenschaft keine NULL-Werte zulässt, kann es sein, dass die Referenznavigation NULL-Werte zulässt oder nicht. In diesem Fall,Post.BlogId
ist nicht nullbar undPost.Blog
ist auch nicht nullbar. Der= null!;
Das Konstrukt wird verwendet, um dies für den C#-Compiler als beabsichtigt zu markieren, da EF normalerweise das festlegtBlog
Instanz und kann für eine vollständig geladene Beziehung nicht null sein. SehenArbeiten mit Nullable-Referenztypenfür mehr Informationen.
Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey(e => e.BlogId) .IsRequired( );}
Im obigen Beispiel beginnt die Konfiguration der Beziehungen mitHat viele
auf dem Hauptentitätstyp (Blog
) und folgt dann mitMit einer
. Wie bei allen Beziehungen ist es genau gleichbedeutend, mit dem abhängigen Entitätstyp zu beginnen (Post
) und verwendenHabe eine
gefolgt vonMit vielen
. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasOne(e => e.Blog) .WithMany(e => e.Posts) .HasForeignKey(e => e.BlogId) .IsRequired( );}
Keine dieser Optionen ist besser als die andere; beide ergeben genau die gleiche Konfiguration.
Tipp
Es ist nie notwendig, eine Beziehung zweimal zu konfigurieren, einmal beginnend beim Prinzipal und dann noch einmal beginnend beim Abhängigen. Auch der Versuch, die Haupt- und die abhängige Hälfte einer Beziehung separat zu konfigurieren, funktioniert im Allgemeinen nicht. Wählen Sie, ob Sie jede Beziehung entweder von einem Ende oder vom anderen Ende aus konfigurieren möchten, und schreiben Sie den Konfigurationscode dann nur einmal.
Optional eins-zu-viele
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int? BlogId { get; Satz; } // Optionale Fremdschlüsseleigenschaft public Blog? Blog { get; Satz; } // Optionale Referenznavigation zum Prinzipal}
Dies ist dasselbe wie im vorherigen Beispiel, außer dass die Fremdschlüsseleigenschaft und die Navigation zum Prinzipal jetzt nullbar sind. Dies macht die Beziehung „optional“, da eine abhängige (Post
) kann existierenohnemit einem Auftraggeber verwandt sein (Blog
).
Wichtig
Beim BenutzenC#-Nullable-Referenztypen, muss die Referenznavigation NULL-fähig sein, wenn die Fremdschlüsseleigenschaft NULL-Werte zulässt. In diesem Fall,Post.BlogId
ist nullbar, alsoPost.Blog
muss auch nullbar sein. SehenArbeiten mit Nullable-Referenztypenfür mehr Informationen.
Nach wie vor ist diese Beziehungdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey(e => e.BlogId) .IsRequired( FALSCH);}
Erforderlich Eins-zu-Viele mit Schatten-Fremdschlüssel
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } öffentlicher Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
In manchen Fällen möchten Sie möglicherweise keine Fremdschlüsseleigenschaft in Ihrem Modell haben, da Fremdschlüssel ein Detail der Darstellung der Beziehung in der Datenbank sind, was nicht erforderlich ist, wenn die Beziehung rein objektorientiert verwendet wird. Wenn Entitäten jedoch serialisiert werden sollen, um sie beispielsweise über eine Leitung zu senden, können die Fremdschlüsselwerte eine nützliche Möglichkeit sein, die Beziehungsinformationen intakt zu halten, wenn die Entitäten nicht in Objektform vorliegen. Daher ist es oft pragmatisch, für diesen Zweck Fremdschlüsseleigenschaften im .NET-Typ beizubehalten. Fremdschlüsseleigenschaften können privat sein. Dies ist oft ein guter Kompromiss, um die Offenlegung des Fremdschlüssels zu vermeiden und gleichzeitig zu ermöglichen, dass sein Wert mit der Entität übertragen wird.
In Anlehnung an die beiden vorherigen Beispiele entfernt dieses Beispiel die Fremdschlüsseleigenschaft aus dem abhängigen Entitätstyp. EF erstellt daher eineSchatten-FremdschlüsseleigenschaftangerufenBlogId
vom Typint
.
Ein wichtiger Punkt, den es hier zu beachten gilt, ist FolgendesC#-Nullable-Referenztypenwerden verwendet, sodass die NULL-Zulässigkeit der Referenznavigation verwendet wird, um zu bestimmen, ob die Fremdschlüsseleigenschaft NULL-Werte zulässt und ob die Beziehung daher optional oder erforderlich ist. Wenn keine Referenztypen verwendet werden, die NULL-Werte zulassen, ist die Schattenfremdschlüsseleigenschaft standardmäßig NULL-fähig, sodass die Beziehung standardmäßig optional ist. In diesem Fall verwenden SieIst erforderlich
um zu erzwingen, dass die Schatten-Fremdschlüsseleigenschaft nicht nullbar ist, und um die Beziehung erforderlich zu machen.
Nach wie vor ist diese Beziehungdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey("BlogId") .IsRequired();}
Optional eins-zu-viele mit Schattenfremdschlüssel
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } öffentlicher Blog? Blog { get; Satz; } // Optionale Referenznavigation zum Prinzipal}
Wie im vorherigen Beispiel wurde die Fremdschlüsseleigenschaft aus dem abhängigen Entitätstyp entfernt. EF erstellt daher eineSchatten-FremdschlüsseleigenschaftangerufenBlogId
vom Typint?
. Im Gegensatz zum vorherigen Beispiel wird die Fremdschlüsseleigenschaft dieses Mal als Nullable-Eigenschaft erstellt, weilC#-Nullable-Referenztypenwerden verwendet und die Navigation auf dem abhängigen Entitätstyp ist nullbar. Dadurch wird die Beziehung optional.
Wenn keine C#-Nullable-Referenztypen verwendet werden, wird die Fremdschlüsseleigenschaft standardmäßig auch als Nullable erstellt. Dies bedeutet, dass Beziehungen mit automatisch erstellten Schatteneigenschaften standardmäßig optional sind.
Nach wie vor ist diese Beziehungdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey("BlogId") .IsRequired(false); }
Eins-zu-viele ohne Navigation zum Prinzipal
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft}
In diesem Beispiel wurde die Fremdschlüsseleigenschaft wieder eingeführt, aber die Navigation auf der abhängigen Eigenschaft wurde entfernt.
Tipp
Eine Beziehung mit nur einer Navigation, eine vom abhängigen zum Hauptelement oder eine vom Hauptelement zum abhängigen Element, aber nicht beides, wird als unidirektionale Beziehung bezeichnet.
Nach wie vor ist diese Beziehungdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne() .HasForeignKey(e => e.BlogId) .IsRequired();}
Beachten Sie, dass der Aufruf anMit einer
hat keine Argumente. Auf diese Weise teilen Sie EF mit, dass keine Navigation erfolgtPost
ZuBlog
.
Wenn die Konfiguration von der Entität ohne Navigation ausgeht, muss der Typ der Entität am anderen Ende der Beziehung explizit mithilfe des Generikums angegeben werdenHasOne<>()
Anruf. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasOne() .WithMany(e => e.Posts) .HasForeignKey(e => e.BlogId) .IsRequired();}
Eins-zu-viele ohne Navigation zum Prinzipal und mit Schattenfremdschlüssel
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; }}
Dieses Beispiel kombiniert zwei der vorherigen Beispiele, indem sowohl die Fremdschlüsseleigenschaft als auch die Navigation auf der abhängigen Eigenschaft entfernt werden.
Diese Beziehung istdurch Konvention entdecktals optionale Beziehung. Da der Code nichts enthält, was darauf hinweisen könnte, dass dies erforderlich sein sollte, ist eine minimale Konfiguration erforderlichIst erforderlich
wird benötigt, um eine erforderliche Beziehung herzustellen. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne() .IsRequired();}
Eine umfassendere Konfiguration kann verwendet werden, um die Navigation und den Fremdschlüsselnamen mit einem entsprechenden Aufruf von explizit zu konfigurierenIst erforderlich()
oderIsRequired(false)
wie benötigt. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne() .HasForeignKey("BlogId") .IsRequired();}
Eins-zu-viele ohne Navigation zu abhängigen Personen
// Principal (parent)public class Blog{ public int Id { get; Satz; }}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft public Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
Die beiden vorherigen Beispiele hatten Navigationen vom Prinzipal zu den abhängigen Elementen, aber keine Navigation vom abhängigen zum Prinzipal. Für die nächsten Beispiele wird die Navigation auf der abhängigen Seite wieder eingeführt, während die Navigation auf der Hauptseite stattdessen entfernt wird.
Nach wie vor ist diese Beziehungdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasOne(e => e.Blog) .WithMany() .HasForeignKey(e => e.BlogId) .IsRequired();}
Beachten Sie das noch einmalMit vielen()
wird ohne Argumente aufgerufen, um anzuzeigen, dass keine Navigation in diese Richtung erfolgt.
Wenn die Konfiguration von der Entität ohne Navigation ausgeht, muss der Typ der Entität am anderen Ende der Beziehung explizit mithilfe des Generikums angegeben werdenHasMany<>()
Anruf. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany() .WithOne(e => e.Blog) .HasForeignKey(e => e.BlogId) .IsRequired();}
Eins-zu-viele ohne Navigation
Gelegentlich kann es sinnvoll sein, eine Beziehung ohne Navigationen zu konfigurieren. Eine solche Beziehung kann nur manipuliert werden, indem der Fremdschlüsselwert direkt geändert wird.
// Principal (parent)public class Blog{ public int Id { get; Satz; }}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft}
Diese Beziehung wird durch Konventionen nicht erkannt, da es keine Navigationen gibt, die darauf hinweisen, dass die beiden Typen verwandt sind. Es kann explizit in konfiguriert werdenOnModelCreating
. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany() .WithOne();}
Mit dieser Konfiguration ist diePost.BlogId
Die Eigenschaft wird weiterhin konventionsgemäß als Fremdschlüssel erkannt und die Beziehung ist erforderlich, da für die Fremdschlüsseleigenschaft keine Nullwerte zulässig sind. Die Beziehung kann „optional“ gemacht werden, indem die Fremdschlüsseleigenschaft auf Null gesetzt wird.
Eine vollständigere explizite Konfiguration dieser Beziehung ist:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany() .WithOne() .HasForeignKey(e => e.BlogId) .IsRequired();}
Eins-zu-viele mit alternativem Schlüssel
In allen bisherigen Beispielen ist die Fremdschlüsseleigenschaft des abhängigen Schlüssels auf die Primärschlüsseleigenschaft des Hauptschlüssels beschränkt. Der Fremdschlüssel kann stattdessen auf eine andere Eigenschaft beschränkt werden, die dann zu einem Alternativschlüssel für den Hauptentitätstyp wird. Zum Beispiel:
// Principal (parent)public class Blog{ public int Id { get; Satz; } public int AlternateId { get; Satz; } // Alternativer Schlüssel als Ziel des Post.BlogId-Fremdschlüssels public ICollection Posts { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft public Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
Diese Beziehung wird nicht durch Konventionen entdeckt, da EF immer durch Konventionen eine Beziehung zum Primärschlüssel herstellen wird. Es kann explizit in konfiguriert werdenOnModelCreating
mit einem Anruf anHasPrincipalKey
. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasPrincipalKey(e => e.AlternateId);}
HasPrincipalKey
kann mit anderen Aufrufen kombiniert werden, um die Navigationen, Fremdschlüsseleigenschaften und die erforderliche/optionale Natur explizit zu konfigurieren. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasPrincipalKey(e => e.AlternateId) .HasForeignKey( e => e.BlogId) .IsRequired();}
Eins-zu-viele mit zusammengesetztem Fremdschlüssel
In allen bisherigen Beispielen bestand die Primär- oder Alternativschlüsseleigenschaft des Prinzipals aus einer einzigen Eigenschaft. Primär- oder Alternativschlüssel können auch aus mehr als einer Eigenschaft gebildet werden – diese werden als bezeichnet„Zusammengesetzte Schlüssel“. Wenn der Hauptschlüssel einer Beziehung einen zusammengesetzten Schlüssel hat, muss der Fremdschlüssel der abhängigen Beziehung ebenfalls ein zusammengesetzter Schlüssel mit der gleichen Anzahl von Eigenschaften sein. Zum Beispiel:
// Principal (parent)public class Blog{ public int Id1 { get; Satz; } // Zusammengesetzter Schlüssel Teil 1 public int Id2 { get; Satz; } // Zusammengesetzter Schlüssel Teil 2 public ICollection Posts { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId1 { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft Teil 1 public int BlogId2 { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft Teil 2 public Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
Diese Beziehung wird durch Konvention entdeckt. Der zusammengesetzte Schlüssel selbst muss jedoch explizit konfiguriert werden:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasKey(e => new { e.Id1, e.Id2 });}
Wichtig
Es wird davon ausgegangen, dass ein zusammengesetzter Fremdschlüsselwert vorliegtNull
wenn einer seiner Eigenschaftswerte null ist. Ein zusammengesetzter Fremdschlüssel mit einer Eigenschaft Null und einer anderen Eigenschaft ungleich Null wird nicht als Übereinstimmung mit einem Primär- oder Alternativschlüssel mit denselben Werten betrachtet. Beides wird berücksichtigtNull
.
BeideHasForeignKey
UndHasPrincipalKey
kann verwendet werden, um Schlüssel mit mehreren Eigenschaften explizit anzugeben. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity( nestedBuilder => { nestedBuilder.HasKey(e => new { e.Id1, e.Id2 }); nestedBuilder.HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasPrincipalKey(e => new { e.Id1, e.Id2 }) .HasForeignKey(e => new { e.BlogId1, e.BlogId2 }) .IsRequired(); } );}
Tipp
Im obigen Code sind die Aufrufe anHasKey
UndHat viele
wurden zu einem verschachtelten Builder zusammengefasst. Verschachtelte Builder machen einen Aufruf überflüssigEntität<>()
mehrmals für denselben Entitätstyp, sind aber funktional äquivalent zum AufrufEntität<>()
mehrmals.
Erforderlich Eins-zu-Viele ohne Kaskadenlöschung
// Principal (parent)public class Blog{ public int Id { get; Satz; } public ICollection Beiträge { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}// Abhängige (untergeordnete) öffentliche Klasse Post{ public int Id { get; Satz; } public int BlogId { get; Satz; } // Erforderliche Fremdschlüsseleigenschaft public Blog Blog { get; Satz; } = null!; // Erforderliche Referenznavigation zum Prinzipal}
Konventionell sind erforderliche Beziehungen so konfiguriertKaskadenlöschung; Dies bedeutet, dass beim Löschen des Prinzipals auch alle seine abhängigen Elemente gelöscht werden, da abhängige Elemente ohne einen Prinzipal nicht in der Datenbank existieren können. Es ist möglich, EF so zu konfigurieren, dass eine Ausnahme ausgelöst wird, anstatt automatisch abhängige Zeilen zu löschen, die nicht mehr vorhanden sein können:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .OnDelete(DeleteBehavior.Restrict);}
Selbstreferenzierung Eins-zu-Viele
In allen vorherigen Beispielen unterschied sich der Hauptentitätstyp vom abhängigen Entitätstyp. Dies muss nicht der Fall sein. Zum Beispiel in den folgenden Typen, jeweilsMitarbeiter
hängt mit anderen zusammenMitarbeiter
.
öffentliche Klasse Employee{ public int Id { get; Satz; } public int? ManagerId { get; Satz; } // Optionale Fremdschlüsseleigenschaft public Employee? Manager { get; Satz; } // Optionale Referenznavigation zum Prinzipal public ICollection Reports { get; } = new List(); // Sammlungsnavigation mit abhängigen Elementen}
Diese Beziehung istdurch Konvention entdeckt. Für Fälle, in denen die Navigation, der Fremdschlüssel oder die erforderliche/optionale Art der Beziehung nicht durch Konvention erkannt werden, können diese Dinge explizit konfiguriert werden. Zum Beispiel:
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasOne(e => e.Manager) .WithMany(e => e.Reports) .HasForeignKey(e => e.ManagerId) .IsRequired( FALSCH);}