Hoe de primaire sleutel voor identiteitskolom te krijgen

Ik gebruik de volgende code om een ​​controlespoor te maken in een MVC3-app.

http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/

In het codevoorbeeld gebruiken ze GUID's voor primaire sleutels. In mijn geval gebruik ik Identiteitskolommen die automatisch worden verhoogd. De code in de link hierboven werkt prima, behalve bij 'toevoegen' kan ik de primaire sleutel niet ophalen (retourneer 0 als de for deze gegevens niet verzendt) bij het aanroepen van dbentry.current-waarden.

Ik probeer een manier te vinden om de primaire sleutel te krijgen, zodat ik deze correct aan mijn transactietabel kan toevoegen. Ik weet dat je dit achteraf kunt ophalen, maar ik weet niet zeker wat de beste manier is om dat te krijgen en werk de tabel vervolgens bij met de juiste primaire sleutel.

Om het even welke ideeën zouden worden gewaardeerd. Ik zou mijn primaire sleutels liever niet willen veranderen in GUID's.

Ik heb de volgende wijzigingen in mijn dbcontext aangebracht die werkt.

if (ent.State == System.Data.EntityState.Added)
            {
                base.SaveChanges();
                ent.State = System.Data.EntityState.Added;
            }

dan wordt in de functie GetAuditRecordsForChange opnieuw ontkoppeld, zodat het record niet twee keer wordt gemaakt.

if (dbEntry.State == System.Data.EntityState.Added)
        {
           //For Inserts, just add the whole record
           //If the entity implements IDescribableEntity, use the description from Describe(), otherwise use ToString()                   
            result.Add(new TransactionHistory()
            {
                TransactionTypeID = 1,
                TableName = tableName,
                FieldName = "ALL",
                RecordPK = dbEntry.CurrentValues.GetValue(keyName).ToString(),
                OldValue = null,
                NewValue = (dbEntry.CurrentValues.ToObject() is IDescribableEntity) ? (dbEntry.CurrentValues.ToObject() as IDescribableEntity).Describe() : dbEntry.CurrentValues.ToObject().ToString(),
                TransactionBy = userId,
                TransactionDate = changeTime,
                TransactionApplication = "Galactus"
            });
            dbEntry.State = System.Data.EntityState.Detached;
        }




1

1 antwoord

Je kunt het niet in één run doen met database-gegenereerde PK. Dat is de reden waarom het bericht GUID's gebruikt. De PK van record die moet worden ingevoegd is pas bekend na de invoeging = nadat u SaveChanges heeft uitgevoerd. U moet dus uw invoeglog daarna opnieuw bouwen en SaveChanges opnieuw.

2
toegevoegd
Bedankt, ik heb een aantal kleine wijzigingen aangebracht die werken. Als de entiteitstatus wordt toegevoegd, voer ik een opslagwijziging uit en stel vervolgens de status opnieuw in, zodat de logica blijft werken voor de controlefunctie, maar loskoppelen na het toevoegen van de audit. Dit lijkt goed te werken.
toegevoegd de auteur Jeff, de bron