Der Entity-Framework-Code erstellt zuerst die Spalte "Diskriminator"

73

Ich verwende den EF CF-Ansatz für eine Website mit MySQL. Aus irgendeinem Grund erstellt EF in meiner Post-Tabelle eine Spalte mit dem Namen "Discriminator" und enthält die VARCHAR "Post".

Warum wird diese Spalte erstellt? Kann ich etwas tun, um zu verhindern, dass es erstellt wird? Gibt es irgendwelche Vorteile dieser Spalte?

kasperhj
quelle

Antworten:

117

Die DiscriminatorSpalte wird in Vererbungsszenarien für Tabellen pro Hierarchie verwendet und ist erforderlich . Wenn Sie zum Beispiel ein Modell wie dieses haben ...

public abstract class BaseEntity
{
    public int Id { get; set; }
    //...
}

public class Post : BaseEntity
{
    //...
}

public class OtherEntity : BaseEntity
{
    //...
}

... und den BaseEntityTeil des Modells erstellen, z. B. durch Hinzufügen eines DbSet<BaseEntity>zu Ihrem abgeleiteten Kontext, ordnet Entity Framework diese Klassenhierarchie standardmäßig einer einzelnen Tabelle zu, führt jedoch eine spezielle Spalte ein - die Discriminator-, um zwischen den verschiedenen Typen zu unterscheiden ( Postoder OtherEntity) in dieser Tabelle gespeichert. Diese Spalte wird mit dem Namen des Typs (erneut Postoder OtherEntity) gefüllt.

Slauma
quelle
2
Danke für die gute Antwort. Mein Modell ist jedoch nicht abgeleitet. Warum macht EF immer noch den Diskriminator?
Kasperhj
2
@lejon: Kannst du das Modell in deiner Frage zeigen? Ich habe noch nie eine Discriminatorandere Spalte als in einem Vererbungskontext gesehen. Mein Code oben ist nur ein Beispiel. Sie würden das gleiche zum Beispiel erhalten, wenn Postselbst nicht abgeleitet wird, aber wenn es andere Entitäten gibt, von denen abgeleitet wird Post.
Slauma
1
Aha! Ein weiteres Modell von Post abgeleitet. Danke für die Antwort!
Kasperhj
8

Sie können die Erstellung der Spalte stoppen, indem Sie die [NotMapped]Datenanmerkung zu den Modellen hinzufügen, die von Ihrer Basisklasse erben. Dadurch wird EF angewiesen, Ihre Klasse nicht zu zukünftigen Migrationen hinzuzufügen, wodurch die Diskriminatorspalte entfernt wird.

public class BaseClass
{
}
[NotMapped]
public class InheritingClass : BaseClass 
{
}
PontiusTheBarbarian
quelle
0

Der Vollständigkeit halber können Sie Folgendes tun, wenn Sie die fließende API verwenden möchten, um zu verhindern, dass die erbende Klasse einer Entität zugeordnet wird (und daher die Erstellung der Diskriminatorspalte zu stoppen):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore<InheritingClass>();
}
Matt
quelle