myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » [gelöst] Wieso verlangt Add-Migration-Befehl, dass eine ID fehlt, obwohl das Property definiert ist?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Paschulke
myCSharp.de-Mitglied

Dabei seit: 27.03.2011
Beiträge: 63


Paschulke ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...te-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:

C#-Code:
    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:

C#-Code:
    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:

C#-Code:
        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 19.10.2020 09:42.

Neuer Beitrag 19.10.2020 08:59 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.655
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 19.10.2020 09:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Paschulke
myCSharp.de-Mitglied

Dabei seit: 27.03.2011
Beiträge: 63

Themenstarter Thema begonnen von Paschulke

Paschulke ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Leider derselbe Fehler, wenn ich Deine Anregung richtig verstehe...
Durch ApplyConfiguration hatte ich ja dasselbe gemacht. Aber einen Versuch war's wert:

C#-Code:
        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);
        }
Neuer Beitrag 19.10.2020 09:12 Beiträge des Benutzers | zu Buddylist hinzufügen
Paschulke
myCSharp.de-Mitglied

Dabei seit: 27.03.2011
Beiträge: 63

Themenstarter Thema begonnen von Paschulke

Paschulke ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
public DbSet<NachrichtMap> Nachrichten { get; set; }

Da muss natürlich die Entität als generischer Parameter verwendet werden:

C#-Code:
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!!!
Neuer Beitrag 19.10.2020 09:41 Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.363
Entwicklungsumgebung: Visual Studio 2019
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 19.10.2020 10:06 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.655
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
Neuer Beitrag 19.10.2020 11:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
HansFred
myCSharp.de-Mitglied

Dabei seit: 19.10.2020
Beiträge: 46


HansFred ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Neuer Beitrag 19.10.2020 17:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.655
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
Neuer Beitrag 19.10.2020 19:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 30.11.2020 00:17