2017-12-21 4 views
1

Ich habe jetzt die folgenden zwei KlassenEF Kern - Navigationseigenschaft in Index

public class Tip 
{ 
    public string Home { get; set; } 
    public string Away { get; set; } 
    public string Prediction { get; set; } 
    public Tipster Tipster { get; set; } 
    ... other properties 
} 


public class Tipster 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public string Platform { get; set; } 
} 

, ich will in TheTip Tabelle eindeutigen Index machen. Nach Angaben der EF-Core-Dokumentation gibt es keine Daten Anmerkungen Syntax, so dass ich bin mit dem fließend ein:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Tip>() 
      .HasIndex(entity => new { entity.Tipster, entity.Home, entity.Away, entity.Prediction }) 
      .HasName("IX_UniqueTip") 
      .IsUnique(); 
    } 

Nun, wenn ich die Datenbank ich folgende Fehler

C erhalten aktualisieren :. .> dotnet ef Datenbankupdate System.InvalidOperationException: Kann Property für die Eigenschaft 'Tipster' für den Entitätstyp 'Tip' nicht aufrufen, da es als Navigationseigenschaft konfiguriert ist. Property kann nur verwendet werden, um skalare Eigenschaften zu konfigurieren.

Es scheint, dass EF die Tatsache nicht mochte, dass ich referentielle Eigenschaft im Index verwende. Wie kann ich das beheben?

Antwort

1

So haben Sie Ihre Entitäten definiert EF wird die referentielle Spalte in die Tipster-Tabelle einfügen, da sie wie eine 1-n-Beziehung aussieht. Dh ein Tipper kann mehrere Tipps platzieren, aber jeder Tipp wird nur von einem Tipper platziert.

Das bedeutet auf Datenbankebene gibt es nichts zu indizieren. Keine Spalte, kein Schlüssel - nichts.

Um das zu beheben, könnten Sie sich fragen, was Sie eigentlich mit einem Index erreichen wollen. Ein Index soll Abfragen mit den Spalten des Index schneller machen und einen vollständigen Tabellenscan vermeiden.

1

Sie können die Navigationseigenschaft nicht im indexdefinierenden Ausdruck verwenden. Stattdessen sollten Sie die entsprechende FK-Eigenschaft verwenden. Das Problem in Ihrem Fall ist, dass Sie keine explizite FK-Eigenschaft in Ihrem Modell Tip haben. Per Konvention erstellt EF Core int? TipsterIdshadow property. So theoretisch sollten Sie in der Lage sein EF.Property Methode zu verwenden, um darauf zuzugreifen:

.HasIndex(e => new { TipsterId = EF.Property<int>(e, "TipsterId"), e.Home, e.Away, e.Prediction }) 

Leider ist diese Zeit nicht funktioniert (EF-Core 2.0.1). Also müssen Sie auf HasIndex Überladung mit params string[] propertyNames zurückgreifen:

Verwandte Themen