Пример #1
0
        public async Task Can_get_next_values_test(bool async)
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var stateEntry = TestHelpers.CreateStateEntry <WithGuid>(_model);
            var property   = stateEntry.EntityType.GetProperty("Id");

            var values = new HashSet <Guid>();

            for (var i = 0; i < 100; i++)
            {
                if (async)
                {
                    await sequentialGuidIdentityGenerator.NextAsync(stateEntry, property);
                }
                else
                {
                    sequentialGuidIdentityGenerator.Next(stateEntry, property);
                }

                Assert.False(stateEntry.HasTemporaryValue(property));

                values.Add((Guid)stateEntry[property]);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
Пример #2
0
        // Inject options in constructor, generate PK
        // parameter "options" is the DbContextOptions<ContactContext> for our Contact Context
        public ContactContext(DbContextOptions <ContactContext> options)
            : base(options)
        {
            // generate sequential GUIDs to reduce bad splits/fragmentation in memory when inserting contacts
            var sequentialGuidGenerator = new SequentialGuidValueGenerator();

            _id = sequentialGuidGenerator.Next(null);
            Debug.WriteLine($"{_id} context created.");
        }
        public void Can_get_next_values()
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var values = new HashSet<Guid>();
            for (var i = 0; i < 100; i++)
            {
                var generatedValue = sequentialGuidIdentityGenerator.Next(null);

                values.Add(generatedValue);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
Пример #4
0
        public void Can_get_next_values()
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var values = new HashSet <Guid>();

            for (var i = 0; i < 100; i++)
            {
                var generatedValue = sequentialGuidIdentityGenerator.Next();

                values.Add(generatedValue);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
        public async Task Can_get_next_values_test(bool async)
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var values = new HashSet<Guid>();
            for (var i = 0; i < 100; i++)
            {
                var guid = async
                    ? await sequentialGuidIdentityGenerator.NextAsync(Mock.Of<StateEntry>(), Mock.Of<IProperty>())
                    : sequentialGuidIdentityGenerator.Next(Mock.Of<StateEntry>(), Mock.Of<IProperty>());

                values.Add((Guid)guid);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
        public async Task Can_get_next_values_test(bool async)
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var values = new HashSet <Guid>();

            for (var i = 0; i < 100; i++)
            {
                var guid = async
                    ? await sequentialGuidIdentityGenerator.NextAsync(Mock.Of <DbContextConfiguration>(), Mock.Of <IProperty>())
                    : sequentialGuidIdentityGenerator.Next(Mock.Of <DbContextConfiguration>(), Mock.Of <IProperty>());

                values.Add((Guid)guid);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
Пример #7
0
        public async Task Can_get_next_values_test(bool async)
        {
            var sequentialGuidIdentityGenerator = new SequentialGuidValueGenerator();

            var property = _model.GetEntityType(typeof(WithGuid)).GetProperty("Id");

            var values = new HashSet <Guid>();

            for (var i = 0; i < 100; i++)
            {
                var generatedValue = async
                    ? await sequentialGuidIdentityGenerator.NextAsync(property, new DbContextService <DataStoreServices>(() => null))
                    : sequentialGuidIdentityGenerator.Next(property, new DbContextService <DataStoreServices>(() => null));

                values.Add((Guid)generatedValue);
            }

            // Check all generated values are different--functional test checks ordering on SQL Server
            Assert.Equal(100, values.Count);
        }
Пример #8
0
        public partial List <AuditEntry> OnBeforeSaveChanges()
        {
            ChangeTracker.DetectChanges();
            var date = DateTime.Now;

            var userId       = _sessionUser.GetId();
            var auditEntries = new List <AuditEntry>();
            var sequentialId = new SequentialGuidValueGenerator();

            foreach (var entry in ChangeTracker.Entries().Where(e => e.Entity is BaseEntity))
            {
                if (entry.Entity is Audit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged)
                {
                    continue;
                }

                var auditEntry = new AuditEntry(entry);

                auditEntry.EntityName = entry.Entity.GetType().Name;
                auditEntry.UserId     = userId;

                auditEntries.Add(auditEntry);

                switch (entry.State)
                {
                case EntityState.Added:
                    var guid = sequentialId.Next(null);
                    ((BaseEntity)entry.Entity).RowId       = guid;
                    ((BaseEntity)entry.Entity).Referral    = string.IsNullOrEmpty(((BaseEntity)entry.Entity).Referral) ? guid.ToString().Replace("-", "").ToUpper().Substring(0, 20) : ((BaseEntity)entry.Entity).Referral;
                    ((BaseEntity)entry.Entity).CreatedUser = userId;
                    ((BaseEntity)entry.Entity).CreatedOn   = DateTime.Now;

                    auditEntry.Action = Enums.Audit.Action.Created;
                    break;

                case EntityState.Deleted:
                    entry.State = EntityState.Modified;
                    ((BaseEntity)entry.Entity).IsDeleted = true;

                    auditEntry.Action = Enums.Audit.Action.Deleted;
                    //_logger.LogInformation($"Data Context: \"{entry.Entity.GetType().Name}\" deleted. Writing to Audits");
                    break;

                case EntityState.Modified:
                    ((BaseEntity)entry.Entity).IsModified = true;

                    auditEntry.Action = Enums.Audit.Action.Modified;
                    //_logger.LogInformation($"Data Context: \"{entry.Entity.GetType().Name}\" modified. Writing to Audits");
                    break;
                }

                foreach (var property in entry.Properties)
                {
                    if (property.IsTemporary ||
                        property.Metadata.Name.Contains("RowId") ||
                        property.Metadata.Name.Contains("RowVersion"))
                    {
                        // value will be generated by the database, get the value after saving
                        auditEntry.TemporaryProperties.Add(property);
                        continue;
                    }

                    string propertyName = property.Metadata.Name;
                    if (property.Metadata.IsPrimaryKey())
                    {
                        auditEntry.PrimaryKeys[propertyName] = property.CurrentValue;
                        continue;
                    }

                    switch (entry.State)
                    {
                    case EntityState.Added:
                        auditEntry.NewValues[propertyName] = property.CurrentValue;
                        break;

                    case EntityState.Deleted:
                        auditEntry.OldValues[propertyName] = property.OriginalValue;
                        break;

                    case EntityState.Modified:
                        //if (property.IsModified)
                        //{
                        if (auditEntry.Action != Enums.Audit.Action.Deleted)
                        {
                            if (property.IsModified)
                            {
                                auditEntry.NewValues[propertyName] = property.CurrentValue;
                            }
                        }
                        else
                        {
                            if (property.Metadata.Name.Contains("IsDeleted"))
                            {
                                auditEntry.NewValues[propertyName] = property.CurrentValue;
                            }
                        }
                        auditEntry.OldValues[propertyName] = property.OriginalValue;
                        //}
                        break;
                    }
                }
            }

            // Save audit entities that have all the modifications
            foreach (var auditEntry in auditEntries.Where(_ => !_.HasTemporaryProperties))
            {
                Audits.Add(auditEntry.ToAudit());
            }

            // keep a list of entries where the value of some properties are unknown at this step
            return(auditEntries.Where(_ => _.HasTemporaryProperties).ToList());
        }