it-swarm.com.de

Wie kann ich die ID der eingefügten Entität im Entitäts-Framework abrufen?

Ich habe ein Problem mit dem Entity Framework in Asp.net. Ich möchte den ID-Wert erhalten, wenn ich der Datenbank ein Objekt hinzufüge. Wie kann ich das machen?

554
ahmet

Das ist ziemlich einfach. Wenn Sie DB-generierte IDs (wie IDENTITY in MS SQL) verwenden, müssen Sie nur Entity zu ObjectSet und SaveChanges auf verwandten ObjectContext hinzufügen. Id wird automatisch für Sie ausgefüllt:

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

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

Das Entity Framework folgt standardmäßig jedem INSERT mit SELECT SCOPE_IDENTITY(), wenn automatisch generierte Ids verwendet werden.

913
Ladislav Mrnka

Ich habe Ladislav Mrnkas Antwort verwendet, um bei Verwendung des Entity Frameworks die IDs erfolgreich abzurufen. Ich poste jedoch hier, weil ich es missbraucht habe (dh dort verwendet habe, wo es nicht erforderlich war), und dachte, dass ich Ich würde meine Ergebnisse hier posten, falls die Leute versuchen, das Problem, das ich hatte, zu "lösen".

Stellen Sie sich ein Auftragsobjekt vor, das eine Fremdschlüsselbeziehung zum Kunden hat. Als ich gleichzeitig einen neuen Kunden und eine neue Bestellung hinzufügte, tat ich so etwas;

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

In meinem Fall war dies jedoch nicht erforderlich, da zwischen customer.Id und order.CustomerId eine Fremdschlüsselbeziehung bestand

Alles was ich tun musste war dies;

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

Jetzt, wenn ich die Änderungen speichere, wird die ID, die für den Kunden generiert wurde, auch zur Bestellung hinzugefügt. Ich brauche keine zusätzlichen Schritte

Ich bin mir bewusst, dass dies nicht die ursprüngliche Frage beantwortet, aber ich dachte, es könnte Entwicklern, die EF noch nicht kennen, helfen, die am besten bewertete Antwort für etwas zu verwenden, das möglicherweise nicht benötigt wird.

101
mark_h

Sie müssen die Entität nach dem Speichern der Änderungen neu laden. Weil es durch einen Datenbank-Trigger geändert wurde, der von EF nicht verfolgt werden kann. SO wir müssen die Entität erneut aus der DB laden,

db.Entry(MyNewObject).GetDatabaseValues();

Dann

int id = myNewObject.Id;

Schauen Sie sich die @ Jayantha-Antwort in der folgenden Frage an:

Wie kann ich bei Verwendung von defaultValue die ID der eingefügten Entität im Entitäts-Framework ermitteln?

Ein Blick auf die Antwort von @christian in der folgenden Frage kann ebenfalls hilfreich sein:

Kontext für Entity Framework-Aktualisierung?

30
QMaster

Bitte verweisen Sie auf diesen Link.

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

Sie müssen die Eigenschaft von StoreGeneratedPattern auf identity setzen und dann Ihren eigenen Code ausprobieren.

Oder Sie können dies auch verwenden.

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

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

Das Objekt, das Sie speichern, sollte nach dem Übertragen von Änderungen in die Datenbank ein korrektes Id haben.

12
Snowbear

Sie können die ID erst nach dem Speichern abrufen, stattdessen können Sie eine neue Guid erstellen und vor dem Speichern zuweisen.

Ich stoße auf eine Situation, in der ich die Daten in die Datenbank einfügen und gleichzeitig die primäre ID mithilfe des Entity-Frameworks benötigen muss. Lösung:

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

Alle Antworten sind sehr gut für ihre eigenen Szenarien geeignet. Was ich anders gemacht habe, ist, dass ich die int-PK direkt von dem Objekt (TEntity) zugewiesen habe, das Add () zu einer int-Variablen wie dieser zurückgegeben hat.

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
}

anstatt also ein ganz neues Objekt zu erstellen, nimmst du einfach, was du willst :)

BEARBEITEN Für Mr. @GertArnold:

enter image description here

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

Das wird funktionieren.

3
Saket Choubey

Es gibt zwei Strategien:

  1. Datenbankgeneriertes ID verwenden (int oder GUID)

    Nachteile:

    Sie sollten SaveChanges() ausführen, um ID für nur gespeicherte Objekte zu erhalten.

    Vorteile:

    Kann int Identität verwenden.

  2. Nur vom Client generierte ID - GUID verwenden.

    Vorteile: Minimierung von SaveChanges Operationen. Kann ein großes Diagramm mit neuen Objekten pro Operation einfügen.

    Nachteile:

    Nur für GUID zulässig

2

Wenn Sie zuerst EF 6.x-Code verwenden

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

und initialisieren Sie eine Datenbanktabelle, es wird ein

(newsequentialid())

klicken Sie in den Tabelleneigenschaften unter der Überschrift Standardwert oder Bindung auf, damit die ID beim Einfügen ausgefüllt werden kann.

Das Problem ist, wenn Sie eine Tabelle erstellen und die hinzufügen

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

teil später werden zukünftige Update-Datenbanken die (newsequentialid ()) nicht wieder hinzufügen.

Um dies zu korrigieren, müssen Sie die Migration rückgängig machen, die Datenbank löschen und erneut migrieren ... oder Sie fügen einfach (newsequentialid ()) zum Tabellen-Designer hinzu.

1
Jeff Li