6
votes

Est-ce que l'entitéFramework Auto attribue des propriétés de navigation sur la création

Lorsque j'exécute le code mentionné ci-dessous, EF enregistre le PersonAddress code> avec le bon Persiciable code>. J'ai pas strud> ajouté le PersonAddress code> à la personne personne code>, même si je n'ai pas fait cela, les enregistrements de ma base de données sont correctement liés. Ma question est la suivante: EF automatiquement strong> ajoutez-vous les entités associées même si je n'ai pas spécifié l'entité qu'il appartient? Et si oui, cela ne peut pas causer des relations entité indésirables fortes> p>

forte> p>

Il semble que les entités soient enregistrées correctement pour le raisons suivantes: p>

  1. Lors de la création d'entité personne code> Le champ code> personnage code> est 0 li>
  2. personaddress.personid code> est également 0 au moment de la création. LI> ol>

    En réglant manuellement le personne.personid code> à n'importe quelle valeur au moment de la création, puis réglage personaddress.personid code> sur cette même valeur de PERSON.PERSONID CODE> EF enregistre les données correctement car elles partagent le même PersonID code>. P>

    si techniquement EF fait pas strong> Ajouter les entités associées automatiquement, ils sont liés comme ils partagent le même PersonID code>. p>

    Veuillez consulter le code ci-dessous comme référence: p> xxx pré>

    quand je Ajoutez une personne code> supplémentaire code> au code, je reçois l'erreur suivante: Entrez la description de l'image ici de
    Code: p> xxx pré>

    comme l'erreur d'erreur spécifiée deframework ne peut désormais pas déterminer à qui les entités code> PersonAddress CODE> appartiennent. P>

    Je peux résoudre Ceci en modifiant le code ci-dessous: p> xxx pré>

    Veuillez voir l'EDMX ci-dessous: p>

     entrer la description de l'image ici p>

    Veuillez consulter le script SQL utilisé pour créer les deux tables: P>

    CREATE TABLE Person
    (
       PersonId INT IDENTITY(1,1) NOT NULL CONSTRAINT [PK_Person] PRIMARY KEY,
       FirstName VARCHAR(250)
    )
    
    CREATE TABLE PersonAddress
    (
       PersonAddressId INT IDENTITY(1,1) NOT NULL CONSTRAINT [PK_PersonAddress]     PRIMARY KEY,
      PersonId INT NOT NULL,
      AddressLine1 VARCHAR(250)
    )
    
      ALTER TABLE PersonAddress
      ADD CONSTRAINT [FK_PersonAddress_Person] FOREIGN KEY(PersonId)
      REFERENCES [Person](PersonId)
    


11 commentaires

Non. EF ne devrait pas lier ensemble les deux objets. Veuillez afficher votre modèle de DB (Spécialement définition de personne et personaddress ) car ce problème est probablement causé par un modèle de DB incorrects.


Je ne vois pas de bons changements entre le premier et le deuxième extrait qui pourrait résoudre l'erreur ( dbupdateException ) dans l'extrait.


Puis-je poster une image du modèle de base de données comme ce sont les deux seules tables?


JENISH RABADIYA - S'il vous plaît voir que dans le dernier code Snippet I appelle personne.personaddresses.add au lieu de context.personaddresses.add (


Comment les identifiants de la personneAddRESS sont-ils générés? IDENTITÉ?


Oui L'ID PersonAddress est l'identité, veuillez vous reporter à la question mise à jour avec le script SQL ci-joint utilisé pour créer les deux tables.


Vérifiez que EF est configuré pour utiliser ces valeurs d'identité. Le magasinGeneratedPattern doit être configuré correctement.


Veuillez vous reporter à la question mise à jour avec les captures d'écran ci-jointes des propriétés de colonnes ID.


@Tjaartvanderwalt n'est pas lié à la question mais note pour ajouter @ avant le nom de l'utilisateur dans le commentaire afin que l'utilisateur soit informé de votre commentaire.


@Tjaartvanderwalt Ce n'est pas possible. Vous auriez dû avoir une exception. Quels sont l'identifiant de la personne.Id et personnentaddress.personid lorsque vous l'avez inséré avec premier extrait?


@Jenishrabadiya Je ne reçois aucune erreur sur le premier extrait. Le personaddress.personnid dans la base de données est la valeur de la personne insérée . J'ai maintenant ajouté plusieurs enregistrements de personne via SQL pour obtenir le PERSONID incrémenté, après cela, le premier extrait réussit toujours à relier la nouvelle personne personne et personaddress . Si vous avez le profileur SQL, veuillez exécuter une trace et vous verrez que le SQL généré pour insérer les entités PersonAddress aura le bon personnage comme paramètre.


4 Réponses :


0
votes

Aucun EF ne peut pas ajouter une entité associée automatiquement si vous ne spécifiez pas quelle est la deuxième entité, la raison est la contrainte d'intégrité des données dans la base de données, espérons que cela aide.


2 commentaires

Eh bien, si EF ne le fait pas automatiquement, pourquoi mon premier tirage du code fonctionne-t-il?


Comme je le vois, cela n'a pas fonctionné, avez-vous essayé d'insérer un objet PersonAdresses?



0
votes

Ici, vous attachez les deux entités de la personne au contexte xxx

et ici, vous attachez les deux adresses à l'entité de la première personne xxx p > Donc, fondamentalement, vous dites au cadre d'entité que vous souhaitez cartographier les deux adresses de la première personne. Si vous ne faites pas cela, l'entité framework ne les mappera pas sauf si dans les adresses que vous entrez manuellement

dans votre premier code, vous ne créez que des personnes et des adresses et tentent de les ajouter à la base de données. Il n'y a pas de cartographie entre eux et l'entité Framework ne sait pas qu'ils devraient être liés.


1 commentaires

Le premier extrait de code fonctionne, EF les relie correctement. Veuillez exécuter le premier extrait de code et vous verrez le résultat.



1
votes

J'ai testé le scénario en créant un nouveau projet contre une nouvelle base de données que j'ai créée avec votre script. J'ai ensuite généré un modèle contre le départ, toutes les valeurs par défaut.

Voici le code que j'ai utilisé pour créer la personne et les adresses. xxx

Je peux confirmer que ce code Faites effectivement courir et insérer une personne et deux adresses liées à cette personne. Il ressemble vraiment à EF le file si il n'y a qu'une seule entité qu'elle pourrait éventuellement être liée à. Je ne sais pas si cela est censé être une caractéristique, mais cela peut faire des mauvaises surprises.


5 commentaires

Je suis d'accord, cela peut conduire à des relations non désirées créées.


Fait intéressant, je l'ai essayé avec une personne nullable à l'adresse. Dans ce cas, le personnage reste null. Cela me fait suspecter encore plus que cela est censé être une fonctionnalité.


Cela ne fournit pas de réponse à la question.


@Jenishrabadiya La question était "L'énityFramework ajouta-t-elle automatiquement les entités associées, même si je n'ai pas précisé l'entité qu'elle appartient?". J'ai répondu "il ressemble vraiment à EF le file si il n'y a qu'une seule entité qu'elle pourrait éventuellement lier à." Je ne sais pas pourquoi vous pensez que cela ne répond pas à la question. Si la question était la raison pour laquelle EF est-ce que ce serait une question différente.


Si cela aurait été la question, il a déjà une réponse en post de l'OP en question. Le premier extrait fonctionne bien.



3
votes

Voici ce qui se passe: xxx pré>

A personne code> est créé avec Persiciable code> = 0. p>

context.SaveChanges();


2 commentaires

Réglage IT -1 Jetez une erreur d'erreur en conflit ... Cela signifie que cela fonctionne. très bonne réponse!


Une réponse à la question toujours intéressante (qui me coûte juste quelques heures) "Comment cela a-t-il déjà travaillé?"