v9.6.2017.0808   重构正向工程,基于映射表查找数据库字段类型到实体类型的映射
大石头 编写于 2017-08-08 21:38:06
X
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Xml.Serialization;
using XCode;
using XCode.Configuration;
using XCode.DataAccessLayer;

namespace <#=Config.NameSpace#>
{<#
    String tdis=Table.DisplayName;
    if(!String.IsNullOrEmpty(tdis)) tdis=tdis.Replace("\r\n"," ").Replace("\\", "\\\\").Replace("'", "").Replace("\"", "");
    String tdes=Table.Description;
    if(!String.IsNullOrEmpty(tdes)) tdes=tdes.Replace("\r\n"," ").Replace("\\", "\\\\").Replace("'", "").Replace("\"", "");
    if(String.IsNullOrEmpty(tdis)) tdis=tdes;
    #>
    /// <summary><#=tdis#></summary><# if(tdis!=tdes){#>
    /// <remarks><#=tdes#></remarks><#}#>
    [Serializable]
    [DataObject]
    [Description("<#=tdes#>")]<#
foreach(IDataIndex di in Table.Indexes){if(di.Columns==null||di.Columns.Length<1)continue;#>
    [BindIndex("<#=di.Name#>", <#=di.Unique.ToString().ToLower()#>, "<#=String.Join(",", di.Columns)#>")]<#
}
#>
    [BindTable("<#=Table.TableName#>", Description = "<#=tdes#>", ConnName = "<#=Table.ConnName ?? Config.EntityConnName#>", DbType = DatabaseType.<#=Table.DbType#><#if(Table.IsView){#>, IsView = true<#}#>)]<#
if(Config.RenderGenEntity){#>
    public partial class <#=Table.Name#><TEntity> : I<#=Table.Name#><#
}else{#>
    public partial class <#=Table.Name#> : I<#=Table.Name#><#
}#>
    {<#
if(Table.Columns.Count>0)
{
#>
        #region 属性<#
    foreach(IDataColumn Field in Table.Columns)
    {
        String des=Field.Description;
        if(!String.IsNullOrEmpty(des)) des=des.Replace("\r\n"," ").Replace("\\", "\\\\").Replace("'", "").Replace("\"", "");
        String dis = Field.DisplayName;
        if(!String.IsNullOrEmpty(dis)) dis=dis.Replace("\r\n"," ").Replace("'", " ").Replace("\"", "");
#>
        private <#=Field.DataType.Name#> _<#=Field.Name#>;
        /// <summary><#=des#></summary>
        [DisplayName("<#=dis#>")]
        [Description("<#=des#>")]
        [DataObjectField(<#=Field.PrimaryKey.ToString().ToLower()#>, <#=Field.Identity.ToString().ToLower()#>, <#=Field.Nullable.ToString().ToLower()#>, <#=Field.Length#>)]
        [BindColumn("<#=Field.ColumnName#>", "<#=des#>", "<#=Field.RawType#>", <#=Field.Precision#>, <#=Field.Scale#><#if(Field.Master){#>, Master=<#=Field.Master.ToString().ToLower()#><#}#>)]
        public virtual <#=Field.DataType==null?"":Field.DataType.Name#> <#=Field.Name#>
        {
            get { return _<#=Field.Name#>; }
            set { if (OnPropertyChanging(__.<#=Field.Name#>, value)) { _<#=Field.Name#> = value; OnPropertyChanged(__.<#=Field.Name#>); } }
        }
<#
    }
#>        #endregion

        #region 获取/设置 字段值
        /// <summary>
        /// 获取/设置 字段值。
        /// 一个索引,基类使用反射实现。
        /// 派生实体类可重写该索引,以避免反射带来的性能损耗
        /// </summary>
        /// <param name="name">字段名</param>
        /// <returns></returns>
        public override Object this[String name]
        {
            get
            {
                switch (name)
                {<#
    foreach(IDataColumn Field in Table.Columns)
    {
#>
                    case __.<#=Field.Name#> : return _<#=Field.Name#>;<#
    }
#>
                    default: return base[name];
                }
            }
            set
            {
                switch (name)
                {<#
    Type conv=typeof(Convert);
    foreach(IDataColumn Field in Table.Columns)
    { 
        if(conv.GetMethod("To"+Field.DataType.Name, new Type[]{typeof(Object)})!=null){
#>
                    case __.<#=Field.Name#> : _<#=Field.Name#> = Convert.To<#=Field.DataType.Name#>(value); break;<#
        }else{
#>
                    case __.<#=Field.Name#> : _<#=Field.Name#> = (<#=Field.DataType.Name#>)value; break;<#
        }
    }
#>
                    default: base[name] = value; break;
                }
            }
        }
        #endregion
<#
}
#>
        #region 字段名
        /// <summary>取得<#=tdis#>字段信息的快捷方式</summary>
        public partial class _
        {<#
foreach(IDataColumn Field in Table.GetAllColumns(Tables, true))
{
    String des=Field.Description;
    if(!String.IsNullOrEmpty(des)) des=des.Replace("\r\n"," ");
#>
            ///<summary><#=des#></summary>
            public static readonly Field <#=Field.Name#> = FindByName(__.<#=Field.Name#>);
<#
}
#>
            static Field FindByName(String name) { return Meta.Table.FindByName(name); }
        }

        /// <summary>取得<#=tdis#>字段名称的快捷方式</summary>
        partial class __
        {<#
foreach(IDataColumn Field in Table.GetAllColumns(Tables, true))
{
    String des=Field.Description;
    if(!String.IsNullOrEmpty(des)) des=des.Replace("\r\n"," ");
#>
            ///<summary><#=des#></summary>
            public const String <#=Field.Name#> = "<#=Field.Name#>";
<#
}
#>
        }
        #endregion
    }

    /// <summary><#=tdis#>接口</summary><# if(tdis!=tdes){#>
    /// <remarks><#=tdes#></remarks><#}#>
    public partial interface I<#=Table.Name#><#if(!String.IsNullOrEmpty(Table.BaseType)){#> : I<#=Table.BaseType#><#}#>
    {<#
if(Table.Columns.Count>0)
{
#>
        #region 属性<#
    foreach(IDataColumn Field in Table.Columns)
    {
        String des=Field.Description;
        if(!String.IsNullOrEmpty(des)) des=des.Replace("\r\n"," ");
#>
        /// <summary><#=des#></summary>
        <#=Field.DataType==null?"":Field.DataType.Name#> <#=Field.Name#> { get; set; }
<#
    }
#>        #endregion<#
    if(String.IsNullOrEmpty(Table.BaseType))
    {
#>

        #region 获取/设置 字段值
        /// <summary>获取/设置 字段值。</summary>
        /// <param name="name">字段名</param>
        /// <returns></returns>
        Object this[String name] { get; set; }
        #endregion<#
    }
}
#>
    }
}