Die Discriminator
Spalte 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 BaseEntity
Teil 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 ( Post
oder OtherEntity
) in dieser Tabelle gespeichert. Diese Spalte wird mit dem Namen des Typs (erneut Post
oder OtherEntity
) gefüllt.
Discriminator
andere Spalte als in einem Vererbungskontext gesehen. Mein Code oben ist nur ein Beispiel. Sie würden das gleiche zum Beispiel erhalten, wennPost
selbst nicht abgeleitet wird, aber wenn es andere Entitäten gibt, von denen abgeleitet wirdPost
.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 { }
quelle
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>(); }
quelle