/// <summary> /// 生成与 Sql 配套的参数列表。 /// </summary> /// <param name="meta">The meta.</param> /// <returns></returns> private IDbDataParameter[] GenerateUpdateParameters(EntityBatch meta) { var dba = meta.DBA.RawAccesser; var table = meta.Table; //把所有实体中所有属性的值读取到数组中,参数的值就是这个数组。 var updateLOB = this.UpdateLOB; var parameters = new List <IDbDataParameter>(); var columns = table.Columns; for (int i = 0, c = columns.Count; i < c; i++) { var column = columns[i]; if (!column.Info.IsPrimaryKey && (updateLOB || !column.IsLOB)) { var parameter = dba.ParameterFactory.CreateParameter(); parameter.ParameterName = '@' + column.Name; parameter.SourceColumn = column.Name;//额外地,需要设置 SourceColumn parameter.DbType = column.Info.ColumnMeta.DataType ?? DbTypeHelper.ConvertFromCLRType(column.Info.DataType); parameters.Add(parameter); } } //主键列放在最后。 var pkParameter = dba.ParameterFactory.CreateParameter(); pkParameter.ParameterName = '@' + table.PKColumn.Name; pkParameter.SourceColumn = table.PKColumn.Name; pkParameter.DbType = table.PKColumn.Info.ColumnMeta.DataType ?? DbTypeHelper.ConvertFromCLRType(table.PKColumn.Info.DataType); parameters.Add(pkParameter); return(parameters.ToArray()); }
public static DbType ConvertFromCLRType(Type clrType) { var value = DbTypeHelper.ConvertFromCLRType(clrType); if (value == DbType.Boolean) { value = DbType.String; } return(value); }
/// <summary> /// 根据实体类型创建表的描述信息,并添加到数据库中 /// </summary> /// <param name="em">The memory.</param> /// <exception cref="System.ArgumentNullException"></exception> /// <exception cref="System.InvalidOperationException">refMeta.ReferenceInfo == null</exception> private void BuildTable(EntityMeta em) { var tableMeta = em.TableMeta; //视图类不需要支持数据库迁移。 if (tableMeta.IsMappingView) { return; } var table = new Table(tableMeta.TableName, this.Database); //读取实体的注释 if (_readComment) { table.Comment = _commentFinder.TryFindComment(em.EntityType); } var metaProperties = em.EntityProperties; //var managedProperties = ManagedPropertyRepository.Instance // .GetTypePropertiesContainer(em.EntityType) // .GetNonReadOnlyCompiledProperties(); foreach (var property in metaProperties) { var columnMeta = property.ColumnMeta; if (columnMeta == null) { continue; } var mp = property.ManagedProperty; if (mp == null) { throw new ArgumentNullException(string.Format("{0}.{1} 属性需要使用托管属性进行编写。", em.Name, mp.Name)); } //列名 var propertyName = property.Name; var columnName = columnMeta.ColumnName; if (string.IsNullOrWhiteSpace(columnName)) { columnName = propertyName; } //类型 var propertyType = property.PropertyType; bool isNullableRef = false; #region 引用关系 if (columnMeta.HasFKConstraint) { var refProperty = mp as IRefProperty; if (refProperty != null) { isNullableRef = refProperty.Nullable; var refMeta = em.Property(refProperty.RefEntityProperty); if (refMeta.ReferenceInfo == null) { throw new InvalidOperationException("refMeta.ReferenceInfo == null"); } //引用实体的类型。 var refTypeMeta = refMeta.ReferenceInfo.RefTypeMeta; if (refTypeMeta != null) { var refTableMeta = refTypeMeta.TableMeta; if (refTableMeta != null) { //如果主键表已经被忽略,那么到这个表上的外键也不能建立了。 //这是因为被忽略的表的结构是未知的,不一定是以这个字段为主键。 if (!this.Database.IsIgnored(refTableMeta.TableName)) { var id = refTypeMeta.Property(Entity.IdProperty); //有时一些表的 Id 只是自增长,但并不是主键,不能创建外键。 if (id.ColumnMeta.IsPrimaryKey) { this._foreigns.Add(new ForeignConstraintInfo() { FkTableName = tableMeta.TableName, PkTableName = refTableMeta.TableName, FkColumn = columnName, PkColumn = id.ColumnMeta.ColumnName, NeedDeleteCascade = refProperty.ReferenceType == ReferenceType.Parent }); } } } } } else if (mp == Entity.TreePIdProperty) { var id = em.Property(Entity.IdProperty); //有时一些表的 Id 只是自增长,但并不是主键,不能创建外键。 if (id.ColumnMeta.IsPrimaryKey) { this._foreigns.Add(new ForeignConstraintInfo() { FkTableName = tableMeta.TableName, PkTableName = tableMeta.TableName, FkColumn = columnName, PkColumn = id.ColumnMeta.ColumnName, NeedDeleteCascade = false }); } } } #endregion var dataType = TypeHelper.IgnoreNullable(propertyType); //对于支持多数据类型的 Id、TreePId 属性进行特殊处理。 if (mp == Entity.IdProperty || mp == Entity.TreePIdProperty) { dataType = em.IdType; } var dbType = columnMeta.DataType.GetValueOrDefault(DbTypeHelper.ConvertFromCLRType(dataType)); var column = new Column(columnName, dbType, columnMeta.DataTypeLength, table); if (columnMeta.IsRequired.HasValue) { column.IsRequired = columnMeta.IsRequired.Value; } else { column.IsRequired = !isNullableRef && !propertyType.IsClass && !TypeHelper.IsNullable(propertyType); } //IsPrimaryKey 的设置放在 IsRequired 之后,可以防止在设置可空的同时把列调整为非主键。 column.IsPrimaryKey = columnMeta.IsPrimaryKey; column.IsIdentity = columnMeta.IsIdentity; table.Columns.Add(column); //读取属性的注释。 if (_readComment) { var commentProperty = mp; var refProperty = commentProperty as IRefProperty; if (refProperty != null) { commentProperty = refProperty.RefEntityProperty; } column.Comment = _commentFinder.TryFindComment(commentProperty); } } table.SortColumns(); this.AddTable(table); }