Журнал аудита в базе данных с использованием Entity Farmework mvc - PullRequest
0 голосов
/ 13 июля 2020

Это мой код, который я использую для обновления записи из моего кода.

 if (dbEntry.State == EntityState.Modified)
        {
            foreach (string propertyName in dbEntry.OriginalValues.PropertyNames)
            {
                // For updates, we only want to capture the columns that actually changed
                if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName)))
                {
                    result.Add(new AuditLog1()
                    {
                        AuditLogID = Guid.NewGuid(),
                        UserID = userId,
                        EventDateUTC = changeTime,
                        EventType = "M",    // Modified
                        TableName = tableName,
                        RecordID = dbEntry.OriginalValues.GetValue<object>(keyName).ToString(),
                        ColumnName = propertyName,
                        OriginalValue = dbEntry.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntry.OriginalValues.GetValue<object>(propertyName).ToString(),
                        NewValue = dbEntry.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntry.CurrentValues.GetValue<object>(propertyName).ToString()
                    }
                        );
                }
            }
        }

Но этот код не помещает журнал в мою таблицу AuditLog в базе данных.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы добавляете в контекст. но вам нужно вызвать метод, который фактически сохраняет их в базе данных. (Метод SaveChanges показан позже).

..............

В общем: вам нужно добавить свои элементы в свой DbSet<MyThing> MyThings в myDbContext .

пример:

myDbConext.AuditLogs.Add(theNewAuditLog);

ДОБАВЬТЕ их все .........

И затем вызовите один из следующих:

myDbContext.SaveChanges();

или

myDbContext.SaveChangesAsync(token); /* token is a CancellationToken */

ссылка:

https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.savechangesasync?view=entity-framework-6.2.0

вот do tnet основной учебник:

https://entityframeworkcore.com/saving-data-savechangesasync

вот руководство по entity framework (dot net framework):

https://www.entityframeworktutorial.net/entityframework6/async-query-and-save.aspx

ПРИЛОЖЕНИЕ:

Вы задали другой вопрос о том, что Edit не работает.

это мой типичный код редактирования.

public async Task<MyThing> UpdateAsync(MyThing inputItem, CancellationToken token)
{
    int saveChangesAsyncValue = 0;
    MyThing foundEntity = await this.entityDbContext.MyThings.FirstOrDefaultAsync(item => item.MySurrogateKey == inputItem.MySurrogateKey, token);
    if (null != foundEntity)
    {
        foundEntity.MyStringPropertyOne = inputItem.MyStringPropertyOne;
        foundEntity.MyStringPropertyTwo = inputItem.MyStringPropertyTwo;


        this.entityDbContext.Entry(foundEntity).State = EntityState.Modified;

        saveChangesAsyncValue = await this.entityDbContext.SaveChangesAsync(token);

        /* an exception here would suggest another process changed the "context" but did not commit the changes (usually by SaveChanges() or SaveChangesAsync() */
        if (1 != saveChangesAsyncValue)
        {
            throw new ArgumentOutOfRangeException(string.Format(ErrorMsgExpectedSaveChangesAsyncRowCount, saveChangesAsyncValue), (Exception)null);
        }
    }
    else
    {
        ArgumentOutOfRangeException argEx = new ArgumentOutOfRangeException(string.Format(" SAD FACE {0} ", entity.MyThingKey), (Exception)null);
        this.logger.LogError(argEx);
        throw argEx;
    }

    return foundEntity;
}
0 голосов
/ 13 июля 2020

dbEntry.AuditLogs.add(new AuditLog()
                    {
                        AuditLogID = Guid.NewGuid(),
                        UserID = userId,
                        EventDateUTC = changeTime,
                        EventType = "M",    // Modified
                        TableName = tableName,
                        RecordID = dbEntry.OriginalValues.GetValue<object>(keyName).ToString(),
                        ColumnName = propertyName,
                        OriginalValue = dbEntry.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntry.OriginalValues.GetValue<object>(propertyName).ToString(),
                        NewValue = dbEntry.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntry.CurrentValues.GetValue<object>(propertyName).ToString()
                    });
dbEntry.Savechanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...