v9.7.2018.0421   支持运行时修改DAL连接字符串
大石头 编写于 2018-04-21 14:00:47
X
<#if(Config.RenderGenEntity){#>
        static <#=Table.Name#>()
        {
            // 用于引发基类的静态构造函数,所有层次的泛型实体类都应该有一个
            TEntity entity = new TEntity();
        }<#
}#>

        /// <summary>验证数据,通过抛出异常的方式提示验证失败。</summary>
        /// <param name="isNew"></param>
        public override void Valid(Boolean isNew)
        {
			// 如果没有脏数据,则不需要进行任何处理
			if (!HasDirty) return;

            // 这里验证参数范围,建议抛出参数异常,指定参数名,前端用户界面可以捕获参数异常并聚焦到对应的参数输入框
            //if (String.IsNullOrEmpty(Name)) throw new ArgumentNullException(_.Name, _.Name.DisplayName + "无效!");
            //if (!isNew && ID < 1) throw new ArgumentOutOfRangeException(_.ID, _.ID.DisplayName + "必须大于0!");

            // 建议先调用基类方法,基类方法会对唯一索引的数据进行验证
            base.Valid(isNew);

            // 在新插入数据或者修改了指定字段时进行唯一性验证,CheckExist内部抛出参数异常
            //if (isNew || Dirtys[__.Name]) CheckExist(__.Name);
            <#
            foreach (IDataColumn dc in Table.Columns)
            {
                String name=dc.Name;
                // 处理时间
                if(dc.DataType==typeof(DateTime))
                {
                    if (name.StartsWith("Add", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("Create", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("New", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("Insert", StringComparison.OrdinalIgnoreCase))
                    {
                    #>
            if (isNew && !Dirtys[__.<#=name#>]) <#=name#> = DateTime.Now;<#
                    }
                    else if (name.StartsWith("Update", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("Change", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("Modify", StringComparison.OrdinalIgnoreCase)
                    || name.StartsWith("up", StringComparison.OrdinalIgnoreCase) // Upload
                    || name.StartsWith("Save", StringComparison.OrdinalIgnoreCase))
                    {
                    #>
            if (!Dirtys[__.<#=name#>]) <#=name#> = DateTime.Now;<#
                    }
                }
                // 处理IP
                else if (dc.DataType==typeof(String) 
                    && (name.Equals("IP", StringComparison.OrdinalIgnoreCase) 
                    || name.EndsWith("IP", StringComparison.OrdinalIgnoreCase)&&name.Length>2&&name[name.Length-3]>='a'&&name[name.Length-3]<='z'))
                {
                    #>
            if (!Dirtys[__.<#=name#>]) <#=name#> = WebHelper.UserHost;<#
                }
                // 处理货币
                else if (dc.DataType==typeof(Decimal))
                {
                    #>
            // 货币保留6位小数
            if (Dirtys[__.<#=name#>]) <#=name#> = Math.Round(<#=name#>, 6);<#
                }
                else if (dc.DataType==typeof(Int32) 
                    && (name.Equals("UserID", StringComparison.OrdinalIgnoreCase) 
                    || name.Equals("OperatorID", StringComparison.OrdinalIgnoreCase)))
                {
                    #>
            // 处理当前已登录用户信息
            if (!Dirtys[__.<#=name#>] && ManageProvider.Provider.Current != null) <#=name#> = (Int32)ManageProvider.Provider.Current.ID;<#
                }
                else if (dc.DataType==typeof(String) 
                    && (name.Equals("User", StringComparison.OrdinalIgnoreCase) 
                    || name.Equals("UserName", StringComparison.OrdinalIgnoreCase)
                    || name.Equals("LastUpdate", StringComparison.OrdinalIgnoreCase)
                    || name.Equals("LastModify", StringComparison.OrdinalIgnoreCase)
                    || name.Equals("Operator", StringComparison.OrdinalIgnoreCase)))
                {
                    #>
            // 处理当前已登录用户信息
            if (!Dirtys[__.<#=name#>] && ManageProvider.Provider.Current != null) <#=name#> = ManageProvider.Provider.Current.Name;<#
                }
            }
            #>
        }

        ///// <summary>首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法</summary>
        //[EditorBrowsable(EditorBrowsableState.Never)]
        //protected override void InitData()
        //{
        //    base.InitData();

        //    // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用
        //    // Meta.Count是快速取得表记录数
        //    if (Meta.Count > 0) return;

        //    // 需要注意的是,如果该方法调用了其它实体类的首次数据库操作,目标实体类的数据初始化将会在同一个线程完成
        //    if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}[{1}]数据……", typeof(<#=Config.RenderGenEntity?"TEntity":Table.Name#>).Name, Meta.Table.DataTable.DisplayName);

        //    var entity = new <#=Table.Name#>();<#
        foreach (IDataColumn dc in Table.Columns)
        {
            if(dc.Identity)continue;

            if(dc.DataType==typeof(Int32)){#>
        //    entity.<#=dc.Name#> = 0;<#}
            else if(dc.DataType==typeof(String)){#>
        //    entity.<#=dc.Name#> = "abc";<#}
            else if(dc.DataType==typeof(DateTime)){#>
        //    entity.<#=dc.Name#> = DateTime.Now;<#}
            else if(dc.DataType==typeof(Double)){#>
        //    entity.<#=dc.Name#> = 0;<#}
            else if(dc.DataType==typeof(Boolean)){#>
        //    entity.<#=dc.Name#> = true;<#}
            else if(dc.DataType==typeof(Decimal)){#>
        //    entity.<#=dc.Name#> = 0;<#}
            else if(dc.DataType==typeof(Guid)){#>
        //    entity.<#=dc.Name#> = Guid.NewGuid();<#}
            else{#>
        //    entity.<#=dc.Name#> = <#=dc.DataType.CreateInstance()#>;<#}
        }#>
        //    entity.Insert();

        //    if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}[{1}]数据!", typeof(<#=Config.RenderGenEntity?"TEntity":Table.Name#>).Name, Meta.Table.DataTable.DisplayName);
        //}

        ///// <summary>已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert</summary>
        ///// <returns></returns>
        //public override Int32 Insert()
        //{
        //    return base.Insert();
        //}

        ///// <summary>已重载。在事务保护范围内处理业务,位于Valid之后</summary>
        ///// <returns></returns>
        //protected override Int32 OnInsert()
        //{
        //    return base.OnInsert();
        //}