Nehmen Sie ein Beispiel für die folgenden Entitäten Student und StudentAddress.
Konfigurieren einer Eins-zu-Null-oder-eins-Beziehung mit DataAnnotations:
public class Student
{
public Student() { }
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
[ForeignKey("Student")]
public int StudentAddressId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; }
public virtual Student Student { get; set; }
}
Wenn StudentAddress Einheit folgt nicht Konventionen:
Wenn zum Beispiel nicht StudentAddress Einheit des nicht folgen Konvention für PK, dh ein anderer Name für die Id-Eigenschaft, dann müssen Sie es auch für PK konfigurieren. Stellen Sie sich die folgende StudentAddress-Entität vor, die den Namen StudentId anstelle von StudentAddressId hat.
public class Student
{
public Student() { }
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
[Key, ForeignKey("Student")]
public int StudentId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; }
public virtual Student Student { get; set; }
}
Im obigen Beispiel müssen wir StudentID Eigenschaft als Key sowie ForeignKey konfigurieren. Dadurch wird die StudentId-Eigenschaft in der StudentAddress-Entität als PK und FK definiert.
konfigurieren One-to-Zero-oder-eins-Beziehung mit Fluent API:
Wenn Schüler und StudentAddress die Konventionen folgen: Studenten und StudentAddress Einheiten folgen Sie den Standardcode-first-Konvention für PrimaryKey. Also müssen wir sie nicht konfigurieren, um ihre Primärschlüssel zu definieren. Wir müssen nur die Entität StudentAddress konfigurieren, in der StudentAddressId ForeignKey sein sollte.
Im folgenden Beispiel wird eine Beziehung zwischen Eins und Null oder eine Beziehung zwischen Student und StudentAddress mithilfe der Fluent-API festgelegt.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
.HasOptional(s => s.Address) // Mark Address property optional in Student entity
.WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student
}
In dem obigen Beispiel wird unter Verwendung von Studenten Entität HasOptional() Methode ausgebildet, die die StudentAddress Navigationseigenschaft in Studenten Einheit anzeigt, dass ein optional (nicht erforderlich, wenn Schüler Entität Speicher) ist. Anschließend konfiguriert die WithRequired() -Methode die StudentAddress-Entität und setzt die Student-Navigationseigenschaft von StudentAddress wie erforderlich (erforderlich beim Speichern der StudentAddress-Entität. Es wird eine Ausnahme ausgelöst, wenn die StudentAddress-Entität ohne die Navigationseigenschaft Student speichert). Dies macht StudentAddressId auch als ForeignKey.
So können Sie eine Eins-zu-Null-Beziehung zwischen zwei Entitäten konfigurieren, für die Student-Entität gespeichert werden kann, ohne dass das StudentAddress-Objekt angehängt wird. StudentAddress-Entität kann jedoch nicht ohne Anhängen eines Objekts der Student-Entität gespeichert werden. Dies macht ein Ende erforderlich.
Wenn StudentAddress Einheit Konventionen nicht folgen:
Nun lassen Sie uns ein Beispiel für StudentAddress Einheit nehmen, wo es nicht Primärschlüssel Konvention heißt unterschiedliche Id Eigenschaftsnamen als Id folgt. Betrachten Sie die folgenden Entitäten Student und StudentAddress.
public class Student
{
public Student() { }
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
public int StudentId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; }
public virtual Student Student { get; set; }
}
So, jetzt brauchen wir StudentID Eigentum von StudentAddress für PrimaryKey von StudentAddress sowie ForeignKey wie unten gezeigt zu konfigurieren.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure StudentId as PK for StudentAddress
modelBuilder.Entity<StudentAddress>()
.HasKey(e => e.StudentId);
// Configure StudentId as FK for StudentAddress
modelBuilder.Entity<Student>()
.HasOptional(s => s.Address)
.WithRequired(ad => ad.Student);
}
konfigurieren One-to-One-Beziehung mit Fluent API:
Wir Eins-zu-Eins-Beziehung zwischen Entitäten Fluent API konfigurieren können, wo beide Enden erforderlich sind, Studenten Entitätsobjekt Sinn muss StudentAddress Einheit umfassen Objekt und StudentAddress-Entität muss Student-Entitätsobjekt enthalten, um es zu speichern.
Hinweis: Eine Eins-zu-Eins-Beziehung ist in MS SQL Server technisch nicht möglich. Es wird immer eins zu null oder eins sein. EF bildet Eins-zu-Eins-Beziehungen für Entitäten, die nicht in DB sind.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure StudentId as PK for StudentAddress
modelBuilder.Entity<StudentAddress>()
.HasKey(e => e.StudentId);
// Configure StudentId as FK for StudentAddress
modelBuilder.Entity<Student>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(ad => ad.Student);
}
In dem obigen Beispiel modelBuilder.Entity(). HasRequired (s => s.Address) macht Adresse Eigenschaft StudentAddress erforderlich ist. .WithRequiredPrincipal (ad => ad.Student) macht die Student-Eigenschaft der Entität StudentAddress wie erforderlich. So konfiguriert er beide Enden benötigt. Wenn Sie nun versuchen, die Entität Student ohne Adresse oder die Entität StudentAddress ohne Student zu speichern, wird eine Ausnahme ausgelöst.
Referenz: http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx
Funktioniert das für Sie? Ich kann es nicht zur Arbeit bringen. Ich erzeuge die Datenbank nicht automatisch, da ich bereits existierende Tabellen habe. Meine Profiltabelle hat Id als PK und FK (wie die Beziehung 1: 1 ist). Ich nehme an, dass dies das gleiche ist wie du. Wenn ich versuche, Ihren Code auszuführen, erhalte ich einen Fehler: Ungültiger Spaltenname 'Profile_Id'. Wenn ich diese Spalte zu Benutzer hinzufügen (nicht, dass ich es dort möchte), Benutzer wird zurückgegeben, aber Profil ist null. Die SQL erzeugt wird. SELECT [Extent1] [Id] AS [Id], [Extent1] [Benutzername] AS [Benutzername], [Extent1] [profile_id] AS [profile_id] FROM [DBO.. ]. [Benutzer] AS [Extent1] Irgendwelche Ideen? –
hmm. Bei der zweiten Inspektion sieht das auf sqlce4, aber nicht auf sql server 2010 gut aus, es sei denn, mir fehlt etwas. –
@ zaph0d - Wenn Sie auf eine Eigenschaft zugreifen möchten, die "eine andere Entität" ist, müssen Sie sie "einschließen". Der Weg dazu wäre 'context.Users.Include (" Profile ")'. Profil ist eine "Navigationseigenschaft", die einen JOIN in SQL erfordert. Ich habe meinen Beitrag mit dem Extra an Informationen, die ich für das Profil vergessen habe, bearbeitet. – TheCloudlessSky