public override void Insert(IDbAccesser dba, Entity item) { var idColumn = this.IdentityColumn; if (idColumn != null) { if (_selectSEQSql == null) { var seqName = new StringWriter(); seqName.Write("SEQ_"); this.AppendPrepare(seqName, this.Name); seqName.Write('_'); this.AppendPrepare(seqName, idColumn.Name); var seqNameValue = Rafy.DbMigration.Oracle.OracleMigrationProvider.LimitOracleIdentifier(seqName.ToString()); //此序列是由 DbMigration 中自动生成的。 _selectSEQSql = string.Format(@"SELECT {0} .nextval from dual", seqNameValue); } //由于默认可能不是 int 类型,所以需要类型转换。 var value = dba.RawAccesser.QueryValue(_selectSEQSql); value = TypeHelper.CoerceValue(item.KeyProvider.KeyType, value); idColumn.LoadValue(item, value); //如果实体的 Id 是在插入的过程中生成的, //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。 item.SyncIdToChildren(); } base.Insert(dba, item); }
public override void Insert(IDbAccesser dba, Entity item) { base.Insert(dba, item); var idColumn = this.IdentityColumn; if (idColumn != null) { //由于默认是 decimal 类型,所以需要类型转换。 var value = dba.RawAccesser.QueryValue("SELECT @@IDENTITY;"); value = TypeHelper.CoerceValue(item.KeyProvider.KeyType, value); idColumn.LoadValue(item, value); //如果实体的 Id 是在插入的过程中生成的, //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。 item.SyncIdToChildren(); } }
public override void Insert(IDbAccesser dba, Entity item) { //如果有 Id 列,那么需要在执行 Insert 的同时,执行 SELECT @@IDENTITY。 //在为 SQL Server 插入数据时,执行 Insert 的同时,必须同时执行 SELECT @@IDENTITY。否则会有多线程问题。 var idColumn = this.IdentityColumn; if (idColumn != null) { if (_insertSQL == null) { _insertSQL = this.GenerateInsertSQL(); _insertSQL += Environment.NewLine; _insertSQL += "SELECT @@IDENTITY;"; } var parameters = new List<object>(); foreach (RdbColumn column in this.Columns) { if (this.CanInsert(column)) { var value = column.ReadParameterValue(item); parameters.Add(value); } } //由于默认是 decimal 类型,所以需要类型转换。 var idValue = dba.QueryValue(this._insertSQL, parameters.ToArray()); idValue = TypeHelper.CoerceValue(item.KeyProvider.KeyType, idValue); idColumn.LoadValue(item, idValue); //如果实体的 Id 是在插入的过程中生成的, //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。 item.SyncIdToChildren(); } else { base.Insert(dba, item); } }