Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }