Beispiel #1
0
        /// <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());
        }
Beispiel #2
0
        public static DbType ConvertFromCLRType(Type clrType)
        {
            var value = DbTypeHelper.ConvertFromCLRType(clrType);

            if (value == DbType.Boolean)
            {
                value = DbType.String;
            }
            return(value);
        }
Beispiel #3
0
            /// <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);
            }