Esempio n. 1
0
        /// <summary>
        /// 为指定的聚合启用批量插入。
        /// 此方法会更改整个聚合中所有实体对应的序列的每次递增数为 sequenceStep。
        /// 调用时机:在数据库生成完成后调用。
        /// 原因:在 ORACLE 中,如果要批量插入实体,则需要先把实体对应的 Sequence 变为以 sequenceStep 为每次递增。
        /// 副作用:这会导致不使用批量插入功能时,实体的 Id 号变为 100000,200000,300000 这样的形式递增。
        /// </summary>
        /// <param name="aggtRepo">The aggt repo.</param>
        /// <param name="sequenceStep">The sequence step.</param>
        public static void EnableBatchSequence(IRepository aggtRepo, int sequenceStep = 100000)
        {
            if (sequenceStep < 100)
            {
                throw new ArgumentOutOfRangeException("sequenceStep");
            }

            using (var dba = RdbDataProvider.Get(aggtRepo).CreateDbAccesser())
            {
                foreach (var repo in DomainHelper.EnumerateAllTypesInAggregation(aggtRepo))
                {
                    var table   = RdbDataProvider.Get(repo).DbTable;
                    var seqName = OracleMigrationProvider.SequenceName(table.Name, table.IdentityColumn.Name);
                    dba.ExecuteText(string.Format("ALTER SEQUENCE {0} INCREMENT BY {1} NOCACHE", seqName, sequenceStep));
                }
            }
        }