702 votes

Comment puis-je récupérer l'Id de l'entité insérée en utilisant Entity framework ?

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

Selon Entity Framework la solution est :

using (var context = new EntityContext())
{
    var customer = new Customer()
    {
        Name = "John"
    };

    context.Customers.Add(customer);
    context.SaveChanges();

    int id = customer.CustomerID;
}

Cela ne permet pas d'obtenir l'identité de la table de la base de données, mais l'ID attribué à l'entité. Si nous supprimons un enregistrement de la table, l'identité de la graine ne correspondra pas à l'ID de l'entité.

2 votes

Si vous n'avez besoin que de l'identifiant pour l'utiliser dans une relation de clé étrangère, vous pouvez envisager de simplement définir la propriété de navigation de votre entité dépendante sur l'entité précédemment ajoutée. De cette façon, vous n'avez pas à vous soucier d'appeler SaveChanges tout de suite, juste pour avoir l'identité. Autres lectures aquí .

0 votes

Pour Entity Framework Core 3.0, ajoutez le paramètre acceptAllChangesOnSuccess comme true : await _context.SaveChangesAsync(true) ;

5voto

Mr Kunal Points 51

J'ai rencontré une situation où j'ai besoin d'insérer les données dans la base de données et simultanément de demander l'id primaire en utilisant le cadre de l'entité. 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;
 }

4voto

Vous ne pouvez obtenir l'ID qu'après avoir sauvegardé, vous pouvez plutôt créer un nouveau Guid et l'attribuer avant de sauvegarder.

0 votes

Ahmet veut obtenir l'Id après la sauvegarde de toute façon. Bien qu'il s'agisse d'une bonne option pour certains scénarios, c'est une surcharge pour celui-ci.

4voto

IteratioN7T Points 257

Toutes les réponses sont très bien adaptées à leurs propres scénarios, ce que j'ai fait différemment est que j'ai assigné l'int PK directement de l'objet (TEntity) que Add() a retourné à une variable int comme ceci ;

using (Entities entities = new Entities())
{
      int employeeId = entities.Employee.Add(new Employee
                        {
                            EmployeeName = employeeComplexModel.EmployeeName,
                            EmployeeCreatedDate = DateTime.Now,
                            EmployeeUpdatedDate = DateTime.Now,
                            EmployeeStatus = true
                        }).EmployeeId;

      //...use id for other work
}

ainsi, au lieu de créer un tout nouvel objet, vous prenez simplement ce que vous voulez :)

EDIT Pour M. @GertArnold :

enter image description here

3 votes

Il n'est pas vraiment utile d'ajouter une méthode non divulguée pour attribuer un Id. Ceci n'est même pas lié à Entity Framework.

1 votes

@GertArnold J'ai eu la même question que le PO, j'ai trouvé les réponses et les ai transformées en une seule ligne de déclaration, et je n'ai jamais entendu parler de ce terme. méthode non divulguée pouvez-vous expliquer ?

3 votes

Cela signifie simplement que vous ne montrez pas (divulguez) tout ce que vous faites. Peut-être que ce n'est pas clairement décrit, je ne sais pas. Ce que je sais, c'est que Add (si c'est DbSet.Add ) fait pas attribuer magiquement une valeur à EmployeeId .

3voto

Saket Choubey Points 758
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;

Ça va marcher.

4 votes

Le référentiel n'est pas responsable de l'enregistrement des modifications dans la base de données. C'est le travail d'un UnitOfWork.

6 votes

De plus, il n'est absolument pas clair ce que Repository est. Et "ça va marcher" est une explication !

3voto

Vladislav Furdak Points 1485

Il existe deux stratégies :

  1. Utiliser les données générées par la base ID ( int o GUID )

    Cons :

    Vous devez effectuer SaveChanges() pour obtenir le ID pour les seules entités sauvées.

    Pour :

    Peut utiliser int l'identité.

  2. Utiliser les données générées par le client ID - GUID uniquement.

    Pros : Minimisation de SaveChanges opérations. Possibilité d'insérer un grand graphique de nouveaux objets en une seule opération.

    Cons :

    Autorisé uniquement pour GUID

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X