Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

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



Dabei seit:
Beiträge: 63

Themenstarter:

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

beantworten | zitieren | melden

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:
Fehler
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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Paschulke am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

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);
        }
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

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!!!
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1418
Herkunft: NRW

beantworten | zitieren | melden

Zitat von T-Virus
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.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
HansFred
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

Das gab es schon lange vor EF 2 https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/types-and-properties
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers