根据DbSchema生成代码2

根据DbSchema生成代码2

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;
using System.IO;
using Rocky;

namespace Rocky.CodeBuilder
{
    public class DbBuilder : Disposable
    {
        #region 字段
        public event EventHandler DoWork;

        private BackgroundWorker bgWorker;
        #endregion

        #region 属性
        public event ProgressChangedEventHandler ProgressChanged
        {
            add { bgWorker.ProgressChanged += value; }
            remove { bgWorker.ProgressChanged -= value; }
        }
        public event RunWorkerCompletedEventHandler RunWorkerCompleted
        {
            add { bgWorker.RunWorkerCompleted += value; }
            remove { bgWorker.RunWorkerCompleted -= value; }
        }
        public DbSchema Schema { get; set; }
        #endregion

        #region 方法
        public DbBuilder()
        {
            bgWorker = new BackgroundWorker();
            bgWorker.WorkerReportsProgress = true;
            bgWorker.WorkerSupportsCancellation = true;
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
        }
        protected override void DisposeInternal(bool disposing)
        {
            if (disposing)
            {
                bgWorker.Dispose();
            }
            DoWork = null;
            bgWorker = null;
        }

        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            if (this.Schema == null)
            {
                this.Schema = SystemConfig.Instance.GetDbSchema();
                if (this.Schema == null)
                {
                    bgWorker.ReportProgress(100, "GetDbSchema error.");
                    return;
                }
            }
            bgWorker.ReportProgress(0, "Working...");
            var schema = this.Schema.GetSchema();
            GenerateMode mode = SystemConfig.Instance.Mode;
            if ((mode & GenerateMode.Entity) == GenerateMode.Entity)
            {
                AppendEntity(schema);
            }
            if ((mode & GenerateMode.DAC) == GenerateMode.DAC)
            {
                AppendDAC(schema);
            }
            //if ((mode & GenerateMode.TableImage) == GenerateMode.TableImage)
            //{

            //}
            bgWorker.ReportProgress(100, "Completed.");
        }

        public void RunWorkerAsync()
        {
            base.CheckDisposed();
            if (DoWork != null)
            {
                DoWork(this, EventArgs.Empty);
            }
            if (!bgWorker.IsBusy)
            {
                bgWorker.RunWorkerAsync();
            }
        }

        public void CancelAsync()
        {
            if (bgWorker.IsBusy)
            {
                bgWorker.CancelAsync();
            }
        }
        #endregion

        #region Append
        #region Entity
        protected void AppendEntity(DbTableSchema[] schema)
        {
            string path = SystemConfig.Instance.SavePath + SystemConfig.Instance.FolderName + @"\Entity\";
            Runtime.CreateDirectory(path);

            StringBuilder main = new StringBuilder(1600);
            for (int i = 0; i < schema.Length; i++)
            {
                DbTableSchema t_schema = schema[i];
                main.AppendLine("using System;");
                main.AppendLine("using Rocky.Data;");
                main.AppendLine();
                main.AppendLine("namespace " + SystemConfig.Instance.NameSpacePrefix + ".Entity");
                main.AppendLine("{");
                main.AppendLine("    [Table(\"" + t_schema.Name + "\"), Serializable]");
                main.AppendLine("    public class " + t_schema.Name);
                main.AppendLine("    {");

                for (int j = 0; j < t_schema.Columns.Length; j++)
                {
                    DbColumnSchema c_schema = t_schema.Columns[j];
                    TypeCode typeCode = Type.GetTypeCode(c_schema.FieldType);
                    string fieldType = c_schema.FieldType.Name;
                    switch (typeCode)
                    {
                        case TypeCode.String:
                        case TypeCode.Object:
                            if (c_schema.FieldType == typeof(Guid))
                            {
                                if (c_schema.IsNullable)
                                {
                                    goto default;
                                }
                            }

                            if (c_schema.IsPrimaryKey)
                            {
                                main.AppendLine("        [Column(IsNullable = false, IsPrimaryKey = true)]");
                            }
                            else
                            {
                                main.AppendLine("        [Column(IsNullable = " + c_schema.IsNullable.ToString().ToLower() + ")]");
                            }

                            main.AppendLine("        public " + fieldType + " " + c_schema.Name + " { get; set; }");
                            main.AppendLine();
                            break;
                        case TypeCode.Int32:
                        case TypeCode.Int64:
                            if (c_schema.IsNullable)
                            {
                                goto default;
                            }

                            if (c_schema.IsPrimaryKey)
                            {
                                main.AppendLine("        [Column(IsDbGenerated = true, IsPrimaryKey = true)]");
                            }
                            else
                            {
                                main.AppendLine("        [Column(IsNullable = false)]");
                            }

                            main.AppendLine("        public " + fieldType + " " + c_schema.Name + " { get; set; }");
                            main.AppendLine();
                            break;
                        default:
                            if (c_schema.IsNullable)
                            {
                                fieldType += "?";
                            }

                            main.AppendLine("        [Column(IsNullable = " + c_schema.IsNullable.ToString().ToLower() + ")]");
                            main.AppendLine("        public " + fieldType + " " + c_schema.Name + " { get; set; }");
                            main.AppendLine();
                            break;
                    }
                }

                main.AppendLine("    }");
                main.AppendLine("}");
                File.WriteAllText(path + t_schema.Name + ".cs", main.ToString());
                main.Length = 0;

                bgWorker.ReportProgress((100 * i) / schema.Length, t_schema.Name + "Entity");
                Thread.Sleep(200);
            }
        }
        #endregion

        #region Repository
        protected void AppendDAC(DbTableSchema[] schema)
        {
            string path = SystemConfig.Instance.SavePath + SystemConfig.Instance.FolderName + @"\DAC\";
            Runtime.CreateDirectory(path);

            path += "TableComponents.cs";
            Runtime.CreateFileFromResource(CoreHelper.Template_TableComponents, path);
            StringBuilder main = new StringBuilder();
            for (int i = 0; i < schema.Length; i++)
            {
                DbTableSchema dt = schema[i];
                string type = "EntityTable<" + dt.Name + ">";
                main.AppendLine("        public static readonly " + type + " Db" + dt.Name + " = new " + type + "();");
                bgWorker.ReportProgress((100 * i) / schema.Length, dt.Name + "DAC");
                Thread.Sleep(200);
            }
            File.WriteAllText(path, File.ReadAllText(path).Replace("_namespace_", SystemConfig.Instance.NameSpacePrefix).Replace("_Class_", main.ToString()));
        }
        #endregion
        #endregion
    }
}

  

posted on 2013-04-02 18:28 RockyLOMO 阅读(...) 评论(...) 编辑 收藏

简化数据库设计和管理。 使用友好的GUI工具编辑,记录和浏览复杂的数据库。 使用布局简化数据库设计。 通过关注数据库架构的特定部分,可以更好地理解复杂的数据库。 使用我们直观的UI,可以很容易地为复杂模式创建数据库设计。 该界面使您能够简单地通过拖放或双击来执行复杂的动作。 同时轻松浏览来自多个表的数据。 无需成为SQL专家! DbSchema将帮助您编写SQL查询。 具有文本自动补全功能的强大编辑器。 支持所有SQL和NoSQL数据库 DbSchema通过创建自己的保存到项目文件中的架构的本地副本以独特的方式工作。 本地项目文件可以: 使用GIT或任何其他版本控制系统与团队一起处理项目文件 将设计保存到XML项目文件并使用任何文本编辑器将其打开 在多台服务器上部署一个架构 在不同版本之间迁移一个架构并生成迁移脚本 没有数据库连接的设计架构( 脱机 ) 为您的数据库架构生成PDF或交互式HTML5文档。 DbSchema可以比较不同数据库或不同项目文件之间的方案,显示它们并生成迁移脚本。 如果数据库缺少外键,则可以创建将仅保存在DbSchema中的虚拟外键 。 它们将帮助您更好地了解数据库。 这些外键用绿色标记。 使用可配置,随机和反向正则表达式 。 使用JDBC驱动程序连接到任何数据库,对结构进行反向工程,并将其作为ER图查看。 利用具有文本自动完成功能,Groovy脚本支持,脚本和查询执行功能的强大SQL编辑器。 将数据从CSV,XML等加载到数据库中。 使用文本输入,按钮和图表构建简单的Web报表或应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值