verwendetes Datenbanksystem: SQL Server 2019
Ich möchte mit Hilfe der Entity Framework Tools aus meinem Model eine Datenbank erstellen lassen. Analog zu dieser Anleitung: https://docs.microsoft.com/de-de/ef/core/get-started/?tabs=visual-studio#create-the-database
Dabei erhalte ich bei der Ausführung des Befehls Add-Migration immer folgende Fehlermeldung:> Fehlermeldung:
The entity type 'NachrichtMap' requires a primary key to be defined. If you intended to use a keyless entity type call 'HasNoKey()'.
Ich kann sie mir nicht erklären. Habe mittlerweile alle anderen Entitäten und alle anderen Mappings aus meinem Projekt ausgeschlossen. Auch die Basisklasse Entity (mit der Id) habe ich entfernt, sodass ich nur noch folgende kleine Entität in meinem Projekt habe:
public class Nachricht //: Entity
{
public int Id { get; set; }
public DateTime Erstellungszeitpunkt { get; set; }
public string Ueberschrift { get; set; }
public string Text { get; set; }
}
Theoretisch sollte ein Mapping überflüssig sein. Habe es deshalb ohne Überschreibung der OnModelCreating versucht und auch mit Hilfe einer Mapping-Klasse:
public class NachrichtMap : IEntityTypeConfiguration<Nachricht>
{
public void Configure(EntityTypeBuilder<Nachricht> builder)
{
builder.HasKey(x => x.Id);
//builder.HasNoKey(); //führt zum selben Fehler!
}
}
In meinem Context:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.ApplyConfiguration(new NachrichtMap()); //funktioniert auch nicht
modelBuilder.ApplyConfigurationsFromAssembly(typeof(NachrichtMap).Assembly);
}
Ich bin ratlos. Habe schon Visual Studio neu gestartet, einen Rebuild durchgeführt, sogar ein neues Projekt erstellt und dort dasselbe nochmal gemacht.
Bin ich blind? Oder ist da irgendwo ein Bug im Migrationstool?
Die Key zuweisung gehört in das OnModelCreating!
Schau dir mal die Doku an, dann sollte es dir auch klarer werden!
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Leider derselbe Fehler, wenn ich Deine Anregung richtig verstehe...
Durch ApplyConfiguration hatte ich ja dasselbe gemacht. Aber einen Versuch war's wert:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
////modelBuilder.ApplyConfiguration(new NachrichtMap());
//modelBuilder.ApplyConfigurationsFromAssembly(typeof(NachrichtMap).Assembly);
modelBuilder.Entity<Nachricht>()
.HasKey(x => x.Id);
}
Halleluja!
Ja, ich bin blind. Und dämlich!
Das einzige Detail, das ich hier nicht gepostet und auch die ganze Zeit nicht beachtet hatte war mein DbSet:
public DbSet<NachrichtMap> Nachrichten { get; set; }
Da muss natürlich die Entität als generischer Parameter verwendet werden:
public DbSet<Nachricht> Nachrichten { get; set; }
Dann klappt's auch problemlos! Das Schlimmste: Der Fehler stand tatsächlich korrekt in der Fehlermeldung "The entity type 'NachrichtMap'..."
Sorry!!!
Die Key zuweisung gehört in das OnModelCreating!
Das stimmt so nicht ganz, der Ansatz mit IEntityTypeConfiguration<TEntity> ist schon korrekt.
Das Interface dient dazu, dass man die Mappings der Entities in eigene Klassen ziehen kann und ich persönlich würde das immer dem direkten Mapping in OnModelCreating vorziehen - naja, außer vielleicht bei kleinen Test-Projekten.
@Palladin007
Hast Recht, kannte ich bisher auch noch nicht und steht auch nicht in der Doku.
Dort wird nur mit OnModelCreating gearbeitet, was bei großen Projekten definitiv schnell zu Meter langen Code führt.
Heise hatte dazu auch nicht einen Artikel für EF Core 2.0, in dem dies eingeführt wurde.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Das gab es schon lange vor EF 2 https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/types-and-properties
@HansFred
Dort wird aber wieder der ModelBuilder verwendet.
Klar gibt es den schon vor EF Core.
Hab mich aber auch nicht weiter mit EF6 beschäftigt, lohnt auch nicht wenn man neue Projekte mit EF Core und .NET Core/5 plant.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.