Laden...

[gelöst] Wieso verlangt Add-Migration-Befehl, dass eine ID fehlt, obwohl das Property definiert ist?

Erstellt von Paschulke vor 3 Jahren Letzter Beitrag vor 3 Jahren 749 Views
P
Paschulke Themenstarter:in
69 Beiträge seit 2011
vor 3 Jahren
[gelöst] Wieso verlangt Add-Migration-Befehl, dass eine ID fehlt, obwohl das Property definiert ist?

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?

T
2.219 Beiträge seit 2008
vor 3 Jahren

Die Key zuweisung gehört in das OnModelCreating!
Schau dir mal die Doku an, dann sollte es dir auch klarer werden!

Doku OnModelCreating

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.

P
Paschulke Themenstarter:in
69 Beiträge seit 2011
vor 3 Jahren

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);
        }

P
Paschulke Themenstarter:in
69 Beiträge seit 2011
vor 3 Jahren

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!!!

2.078 Beiträge seit 2012
vor 3 Jahren

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.

T
2.219 Beiträge seit 2008
vor 3 Jahren

@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.

Heise Artikel

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.

H
48 Beiträge seit 2020
vor 3 Jahren
T
2.219 Beiträge seit 2008
vor 3 Jahren

@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.