In che modo Entity Framework tiene traccia dell'oggetto con identità come chiave

1

Voglio capire come ID della traccia EF quando la chiave primaria è identità. (Prima DB)

Ad esempio

class User
{
    int Id; //auto generated via SQL identity, also the primary key of the table Users.
    string Name;
}


//adding a new user-
User user = new User () {Name="TestUser"};//Id will be 0;
DB.Users.Add(user);
DB.SaveChanges();
user.Id; //Will have value;

Altro su se ho la proprietà di navigazione con chiave esterna per l'utente.Id sarà aggiornato pure.

Credo che le tabelle delle tracce EF con la chiave primaria, ma in questo caso siano determinate da SQL (o w / e) durante la creazione, quindi come fa l'EF a ottenere l'ID effettivo dopo la creazione?

    
posta Ziv Weissman 02.01.2017 - 10:20
fonte

1 risposta

1

Non conosco EF, ma Hibernate e Doctrine. Presumo che siano molto simili.

EF conserva un riferimento all'oggetto.

Quando viene chiamato Add(Object) , EF conserva in ogni caso un riferimento all'oggetto (è necessario per rilevare le modifiche).

Quando viene chiamato SaveChanges() , EF passa attraverso tutti i riferimenti che ha memorizzato. Vede l'istanza User e sa che la strategia PK è IDENTITY e che l'istanza stessa non ha ancora un valore PK; Di conseguenza, EF decide di eseguire un'istruzione INSERT per quell'istanza. Quindi utilizza il driver DB per determinare l'ID della riga che ha appena scritto e scrive quel valore sulla proprietà. (Probabilmente con LAST_INSERT_ID() ).

Qualche pseudo codice:

void Add(obj) {
    // add the object to the interal set of entities; this will keep track
    this.entitySet.add(obj);
}

void SaveChanges() {
    foreach entity in this.entitySet {
        if (isIdentityPK(entity) && !hasPKValue(entity)) {
            executeSQL("INSERT INTO ... VALUES (...)");
            id = executeSQL("LAST_INSERT_ID()");
            setEntityPKValue(entity, id);
        }
    }
}
    
risposta data 02.01.2017 - 11:38
fonte

Leggi altre domande sui tag