public void CaptureChanges() { using (var cn = LocalDb.GetConnection(dbName)) { var emp = new Employee() { LastName = "Herbert", FirstName = "Yavad", HireDate = new DateTime(1990, 1, 1), IsExempt = true }; // need to make sure record doesn't exist try { cn.Execute("TRUNCATE TABLE [changes].[RowVersion]"); } catch { /*do nothing */ } try { cn.Execute("TRUNCATE TABLE [changes].[ColumnHistory]"); } catch { /* do nothing */ } cn.Execute("DELETE [dbo].[Employee] WHERE [FirstName]=@firstName AND [LastName]=@lastName", emp); var provider = new SqlServerCrudProvider <int>((id) => Convert.ToInt32(id)); provider.SaveAsync(cn, emp).Wait(); LoggedChangeTracker <Employee, long> ct = GetLoggedChangeTracker(cn, emp); emp.FirstName = "Javad"; emp.Status = Status.Inactive; provider.SaveAsync(cn, emp, ct).Wait(); Assert.IsTrue(cn.RowExistsAsync("[changes].[RowVersion] WHERE [TableName]='Employee' AND [RowId]=1 AND [Version]=1").Result); Assert.IsTrue(cn.RowExistsAsync("[changes].[ColumnHistory] WHERE [TableName]='Employee' AND [RowId]=1 AND [Version]=1 AND [ColumnName]='FirstName' AND [OldValue]='Yavad' AND [NewValue]='Javad'").Result); Assert.IsTrue(cn.RowExistsAsync("[changes].[ColumnHistory] WHERE [TableName]='Employee' AND [RowId]=1 AND [Version]=1 AND [ColumnName]='Status' AND [OldValue]='Active' AND [NewValue]='Inactive'").Result); } }
private async Task <ChangeTracker <TModel> > InitChangeTrackingAsync <TModel>(IDbConnection connection, IDbTransaction txn, TModel model, IUserBase user, ChangeTracker <TModel> changeTracker) { if (changeTracker != null) { return(changeTracker); } if (typeof(TModel).HasAttribute(out TrackChangesAttribute attr)) { var identity = GetIdentity(model); var existing = await GetAsync <TModel>(connection, identity, txn); if (existing == null) { return(null); } var result = new LoggedChangeTracker <TModel, TIdentity>(this, user, existing); result.Instance = model; foreach (var ignore in attr.GetIgnoreProperties()) { if (result.ContainsKey(ignore)) { result.Remove(ignore); } } return(result); } return(null); }
private static LoggedChangeTracker <TModel, long> GetLoggedChangeTracker <TModel>(IDbConnection cn, TModel model) { LoggedChangeTracker <TModel, long> .InitializeAsync(cn, new DataModel()).Wait(); var result = new LoggedChangeTracker <TModel, long>(new SqlServerCrudProvider <long>((id) => Convert.ToInt64(id)), new LocalUser("adamo"), model); return(result); }