In meinem API-Projekt habe ich
public class Team
{
[Key]
public long Id { set; get; }
[Required]
public TeamSettings TeamSettings { get; set; }
}
public class TeamSettings
{
[Key]
[Required]
[Column("TeamSettingsId")]
public long Id { set; get; }
[Required]
[ForeignKey("TeamId")]
public long TeamId { get; set; }
[Required]
public Team Team { set; get; }
}
Wenn ich benutze
var team = await TeamRepo.GetAsync(t => t.Id == teamId, includes);
Ich kann auf meinem SQL Server Profiler eher einen linken als einen inneren Join sehen.
Ich habe versucht, die Anmerkungen zu entfernen und mich so fließend zu verhalten:
modelBuilder.Entity<Team>()
.HasOne(t => t.TeamSettings)
.WithOne(ts => ts.Team)
.HasForeignKey<TeamSettings>(ts => ts.TeamId);
Trotzdem bekomme ich nur eine linke Verbindung.
Da TeamSettings immer für jedes Team erstellt wird und nicht nullwertfähig ist, sollte es nicht den inneren Join verwenden?
Relationale Datenbanken können keine Eins-zu-Eins-Beziehung (dh beide Enden erforderlich) erzwingen, da keine Standard-FK-Einschränkung das Löschen des abhängigen Datensatzes verhindern kann (in Ihrem Fall TeamSettings
).
Daher unterstützt EF Core dies nicht (das Attribut [Required]
in [Team.TeamSettings]
wird ignoriert). Dies wird im Abschnitt Erforderliche und optionale Beziehungen der Dokumentation erläutert:
Mit der Fluent-API können Sie konfigurieren, ob die Beziehung erforderlich oder optional ist. Letztendlich steuert dies, ob die Fremdschlüsseleigenschaft erforderlich oder optional ist.
Da sich die FK immer auf der abhängigen Seite befindet, bedeutet dies technisch, dass Sie nur steuern können, ob die abhängige Person ohne Prinzipal existieren kann. Aber Prinzipal kann immer ohne Abhängigkeit existieren.
In Kürze sind Beziehungsabhängige immer optional, daher der left join
.