Laden...

Entity Framework Code First - Eine von zwei verknüpften Entitäten hat als ID in der DB "0"

Erstellt von ZeroQool vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.749 Views
Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 7 Jahren
Entity Framework Code First - Eine von zwei verknüpften Entitäten hat als ID in der DB "0"

Hallo zusammen,

ich verwende das Entity Framework in der neusten Version und habe folgendes Problem.

Entität:


public class AspNetUser
    {
....
public int PersonId { get; set; }
public virtual Person Person { get; set; }
}


public class Person 
    {

  public int PersonId { get; set; }
        public int PersonTypeId { get; set; }
        public int SalutationId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public virtual PersonType PersonType { get; set; }
        public virtual Salutation Salutation { get; set; }
}

Jetzt erstelle ich einen AspNetUser Datensatz:


var user = new AspNetUser
            {
   Person = new Person()
                {
                    FirstName = submitModel.FirstName,
                    LastName = submitModel.LastName,                                     
                    PersonTypeId = submitModel.PersonTypeId, 
                    SalutationId = submitModel.SalutationId,                
                }};

            _dbContext.AspNetUsers.Add(user);
            _dbContext.SaveChanges();

Sobald der SaveChanges Befehl ausgeführt wird, sehe ich die 2 Datenbanksätze in der SQL Server 2012 DB, aber in der Spalte PersonId in der Tabelle AspNetUser steht "0".
Wenn ich die Person Tabelle gehe, sehe ich das die PersonId gefüllt ist.

Ich komme einfach nicht auf den Fehler.

Versuche ich über das SQL Management Studio einen Datenatz in der AspNetUser anzulegen und gebe in der PersonId = 0 an kommt sofort eine Fehlermeldung vom Server, dass das nicht zulässig wird.

2.080 Beiträge seit 2012
vor 7 Jahren

Setz an der ID-Property mal das Attribute:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Das sollte dafür sorgen, dass das hoch gezählt wird

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

6.911 Beiträge seit 2009
vor 7 Jahren

Hallo ZeroQool,

Entity Framework in der neusten Version

besser wäre es direkt die Version anzugeben, wie 6.1.3.
In ein, zwei Jahren ist es dann für die Nachwelt schwer nachzuvollziehen welche Version gemeint war. Außerdem ist es auch schon heute mit den Pre-Releases, etc. nicht eindeutig zu sagen welche Version es ist, denn dazu müsste eine Definition von "neuste Version" angegeben werden und da ist es doch einfacher direkt die Version zu nennen 😉

Wie schau der DbContext aus? Sind dort die Verknüpfungen korrekt?
Hast du EF-Powertools (o.ä.) und kannst dir so das Model anzeigen lassen und dort prüfen ob alle Verknüpfungen und Keys so sind wie du erwartest?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.841 Beiträge seit 2008
vor 7 Jahren

Wenn das Feld Id heissen würde, würde das EF automatisch erkennen, dass es sich hier um den Key handelt und ein Auto-Increment erfolgt.
PersonId erkennt das Ef nicht automatisch.

Statt den DataAnnotations wäre es kompatibler, wenn Du das Modelling via Fluent API durchführst.
EntityTypeConfiguration Class in Code-First

PS: Du verwendest nicht die neueste Version des EF.
Du hast EF 6.1.3 und die Nachfolgerversion ist Entity Framework Core 1 (aktuell als RTM).

AspNetUser lässt darauf hindeuten, dass Du eine ASP.NET Anwendung mit einem ASP.NET MemberShipProvider hast.
Warum manipulierst Du die ASP.NET User direkt und nicht - wie vorgesehen - über den MemberShipProvider?

PS2: in Webanwendungen ist es eher angebracht mit Guids statt mit Int-Keys zu arbeiten.
Int-Keys macht das Skalieren von Datenbanken sehr anfällig und mühsam.

B
112 Beiträge seit 2008
vor 7 Jahren

Wenn das Feld Id heissen würde, würde das EF automatisch erkennen, dass es sich hier um den Key handelt und ein Auto-Increment erfolgt.
PersonId erkennt das Ef nicht automatisch.

Das würde mich in der Klasse Person doch arg wundern. Die von Dir genannte Quelle sagt jedenfalls bei den Konventionen (Hervorhebung von mir):

The default convention for primary key is that Code-First would create a primary key for a property if the property name is Id or <class name>Id (NOT case sensitive). (Entity Framework Code First Conventions