Question Comment puis-je obtenir l'ID de l'entité insérée dans le cadre Entity?


J'ai un problème avec Entity Framework dans Asp.net. Je veux obtenir la valeur Id chaque fois que j'ajoute un objet à la base de données. Comment puis-je faire ceci?


448
2018-03-06 19:11


origine


Réponses:


C'est assez facile. Si vous utilisez des ID générés par DB (par exemple IDENTITY dans MS SQL) il vous suffit d'ajouter une entité à ObjectSet et SaveChanges sur connexes ObjectContext. Id sera automatiquement rempli pour vous:

using (var context = new MyContext())
{
  context.MyEntities.AddObject(myNewObject);
  context.SaveChanges();

  int id = myNewObject.Id; // Yes it's here
}

Le cadre d'entité par défaut suit chaque INSERT avec SELECT SCOPE_IDENTITY() lorsqu'il est généré automatiquement Ids sont utilisés.


763
2018-03-06 19:18



J'avais utilisé La réponse de Ladislav Mrnka pour récupérer avec succès IDs lors de l'utilisation de l'Entity Framework mais je poste ici parce que je l'avais manqué (en l'utilisant où il n'était pas nécessaire) et pensé que je publierais mes résultats ici au cas où les gens cherchent à "résoudre" "le problème que j'avais.

Considérons un objet Order ayant une relation de clé étrangère avec le client. Quand j'ai ajouté un nouveau client et une nouvelle commande en même temps, je faisais quelque chose comme ça;

var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id

Cependant, dans mon cas, ce n'était pas nécessaire car j'avais une relation de clé étrangère entre customer.Id et order.CustomerId

Tout ce que j'avais à faire était ceci;

var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer}; 
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order

Maintenant, lorsque je sauvegarde les modifications, l'ID généré pour le client est également ajouté à la commande. Je n'ai pas besoin des étapes supplémentaires

Je suis conscient que cela ne répond pas à la question initiale, mais je pense que cela pourrait aider les développeurs qui sont nouveaux à EF à surutiliser la meilleure réponse pour quelque chose qui n'est peut-être pas nécessaire.


63
2017-12-14 15:35



Vous devez recharger l'entité après les modifications. Parce qu'il a été modifié par un déclencheur de base de données qui ne peut pas être suivi par EF. Nous devons donc recharger l'entité à partir de la base de données,

db.Entry(MyNewObject).GetDatabaseValues();

alors

int id = myNewObject.Id;

Regardez @jayantha réponse ci-dessous question:

Comment puis-je obtenir l'ID de l'entité insérée dans Entity Framework lors de l'utilisation de defaultValue?

Regarder la réponse de @christian dans la question ci-dessous peut aider aussi:

Entity Framework Actualiser le contexte?


18
2017-07-19 17:37



S'il vous plaît se référer ce lien.

http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/

Vous devez définir la propriété de StoreGeneratedPattern à l'identité, puis essayez votre propre code.

Ou bien vous pouvez aussi l'utiliser.

using (var context = new MyContext())
{
  context.MyEntities.AddObject(myNewObject);
  context.SaveChanges();

  int id = myNewObject.Id; // Your Identity column ID
}

12
2017-12-07 11:11



L'objet que vous enregistrez doit avoir une valeur correcte Id après la propagation des changements dans la base de données.


8
2018-03-06 19:17



Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;

Cela fonctionnera.


6
2018-06-28 17:16



Vous pouvez obtenir un identifiant uniquement après la sauvegarde, mais vous pouvez créer un nouveau Guid et l'assigner avant de l'enregistrer.


3
2018-05-03 15:35



Je suis confronté à une situation où je dois insérer les données dans la base de données et exiger simultanément l'identifiant primaire en utilisant l'entité framework. Solution :

long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
 {
    InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
    InfoBase.Add(generalinfo);
    InfoBase.Context.SaveChanges();
    id = entityclassobj.ID;
    return id;
 }

1
2017-08-13 10:54



Lorsque vous utilisez le code EF 6.x en premier

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

et initialiser une table de base de données, il mettra un

(newsequentialid())

à l'intérieur des propriétés de la table sous l'en-tête Valeur par défaut ou Liaison, permettant à l'ID d'être renseigné lors de son insertion.

Le problème est que si vous créez une table et ajoutez le

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

une partie plus tard, les futures bases de données de mise à jour ne rajouteront pas le (newsequentialid ())

Pour corriger le problème, il faut effacer la migration, supprimer la base de données et la re-migrer ... ou simplement ajouter (newsequentialid ()) dans le concepteur de la table.


0
2018-01-09 18:16