2017-12-05 4 views
2

Ich habe zwei Klassen:EF Core: Wie fügt man die Beziehung zur Schatteneigenschaft hinzu?

public class DbLibrary 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public List<DbDepartment> Departments { get; set; } = new List<DbDepartment>(); 
} 

public class DbDepartment 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

In diesem Modell Ich brauche DbDepartment hat den Link zu DbLibrary nicht die Eigenschaft enthalten. Aber ich brauche die Kaskadenlöschung auf der Datenbankseite. Zu diesem Zweck füge ich die Schatteneigenschaft zu DbDepartment hinzu. Es ist der Fremdschlüssel. Wie verbindet man den Primärschlüssel DbLibrary mit der Schatteneigenschaft?

Dies ist mein Versuch:

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    // Create the shadow property 
    var id = builder.Entity<DbDepartment>().Property<Guid>("LibraryId"); 

    // Create the relationship for cascade delete 
    builder.Entity<DbLibrary>().HasMany(n => n.Departments) 
     .WithOne(m => id /* it is wrong */).OnDelete(DeleteBehavior.Cascade); 
} 
+1

Ich habe keinen Schatten-Eigenschaft. Was meinst du damit? – ViRuSTriNiTy

+2

Ich meine dies: https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties. I.e. Die Spalte "LibraryId" befindet sich nur in der Tabelle der Datenbank, aber die Klasse "DbDepartment" enthält keine Eigenschaft mit dieser Information. –

+0

Entsprechend dem zitierten Link müssen Sie 'public DbLibrary Library {get; einstellen; } 'zu' DbDepartment'. Funktioniert das? – ViRuSTriNiTy

Antwort

4

Schatteneigenschaften stellen eine primitiven Eigenschaften (FK in Ihrem Fall) und nicht verwendet werden kann, Navigationseigenschaft zu erstellen.

Um das Beziehungsende ohne Navigationseigenschaft zu konfigurieren, verwenden Sie die entsprechende Has/With parameterlose Überlast. Ob der FK Schatten oder normale Eigenschaft ist, spielt keine Rolle. Es spielt eine Rolle, wenn Sie den zugehörigen FK mit der Methode HasForeignKey konfigurieren. Dies bedeutet, dass Sie für Schatteneigenschaften die Überladung mit dem Eigenschaftsnamen string anstelle des Lambda-Ausdrucks verwenden müssen.

Hier ist die gewünschte Konfiguration fließend:

builder.Entity<DbLibrary>() 
    .HasMany(e => e.Departments) 
    .WithOne() 
    .HasForeignKey("LibraryId") 
    .OnDelete(DeleteBehavior.Cascade); 
Verwandte Themen