Esempio n. 1
0
 internal PersistanceColumnInfo(
     string name,
     EntityPropertyMeta propertyMeta,
     ColumnMeta columnMeta,
     PersistanceTableInfo table,
     DbTypeConverter dbTypeConverter
     )
 {
     this.Table        = table;
     this.Name         = name;
     this.Meta         = columnMeta;
     this.PropertyType = TypeHelper.IgnoreNullable(propertyMeta.PropertyType);
     this.DbType       = columnMeta.DbType ?? dbTypeConverter.FromClrType(this.PropertyType);
     this.Property     = propertyMeta.ManagedProperty as IProperty;
 }
Esempio n. 2
0
        private static void ProcessManagedProperties(
            RdbTableInfo table,
            EntityMeta em,
            IDbIdentifierQuoter identifierProvider,
            DbTypeConverter dbTypeConverter
            )
        {
            foreach (var property in em.EntityProperties)
            {
                var columnMeta = property.ColumnMeta;
                if (columnMeta == null)
                {
                    continue;
                }

                var propertyName = property.Name;

                var epm = em.Property(propertyName);
                if (epm == null)
                {
                    throw new ArgumentNullException(string.Format("{0}.{1} 属性需要使用托管属性进行编写。", em.EntityType.FullName, propertyName));
                }

                var columnName = identifierProvider.Prepare(columnMeta.ColumnName);

                var dbType = columnMeta.DbType ?? dbTypeConverter.FromClrType(epm.PropertyType);;
                var column = new RdbColumnInfo(columnName, epm, columnMeta, table, dbType);

                if (columnMeta.IsPrimaryKey)
                {
                    table.PKColumn = column;
                }

                table.Columns.Add(column);
            }
        }
Esempio n. 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;

                    //类型
                    var  propertyType  = property.PropertyType;
                    bool isNullableRef = false;

                    #region 引用关系

                    if (columnMeta.HasFKConstraint)
                    {
                        var refProperty = mp as IRefProperty;
                        if (refProperty != null)
                        {
                            isNullableRef = refProperty.Nullable;

                            //是否生成外键
                            // 默认 IsGeneratingForeignKey 为 true
                            if (IsGeneratingForeignKey)
                            {
                                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 (IsGeneratingForeignKey && 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.DbType.GetValueOrDefault(_dbTypeConverter.FromClrType(dataType));
                    var column = new Column(columnName, dbType, columnMeta.DbTypeLength, 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);
            }