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

        ///// <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();
        //}

        ///// <summary>验证数据,通过抛出异常的方式提示验证失败。</summary>
        ///// <param name="isNew"></param>
        //public override void Valid(Boolean isNew)
        //{
        //    // 这里验证参数范围,建议抛出参数异常,指定参数名,前端用户界面可以捕获参数异常并聚焦到对应的参数输入框
        //    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);
        //    if (isNew || Dirtys[_.Name] || Dirtys[_.DbType]) CheckExist(_.Name, _.DbType);
        //    if ((isNew || Dirtys[_.Name]) && Exist(_.Name)) throw new ArgumentException(_.Name, "值为" + Name + "的" + _.Name.DisplayName + "已存在!");
        //}
<#
if(Table.Relations!=null && Table.Relations.Count>0)
{
	// 是否有一对多和一对一的扩展属性,如果有,删除
	Boolean hasMutil=false;
	foreach(IDataRelation dr in Table.Relations)
	{
		if(!dr.Unique) continue;

		IDataTable rtable = FindTable(dr.RelationTable);
		if (rtable == null) continue;

		hasMutil=true;
		break;
	}
	if(hasMutil)
	{
#>
        /// <summary>已重载。删除关联数据</summary>
        /// <returns></returns>
        protected override int OnDelete()
        {<#	
	foreach(IDataRelation dr in Table.Relations)
	{
		if(!dr.Unique) continue;

		IDataTable rtable = FindTable(dr.RelationTable);
		if (rtable == null) continue;

		Boolean b=dr.Unique;
		// 如果是唯一的,应该判断对方的唯一性,如果对方也是唯一,那么就构成一对一
		if(b&&rtable.Relations!=null)
		{
			foreach(IDataRelation dr2 in rtable.Relations)
			{
				if(dr2.Column==dr.RelationColumn && dr2.RelationTable==Table.TableName && dr2.RelationColumn==dr.Column)
				{
					if(dr2.Unique) b=false;
				}
			}
		}
		String proName=rtable.Name;
		if(b) proName+="s";
		#>
			if (<#=proName#> != null) <#=proName#>.Delete();<#
	}
#>

            return base.OnDelete();
        }<#
	}
}#>

        ///// <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}<#=Table.DisplayName#>数据……", typeof(<#=Config.RenderGenEntity?"TEntity":Table.Name#>).Name);

        //    var entity = new <#=Table.Name#>();
        //    entity.Name = "admin";
        //    entity.Password = DataHelper.Hash("admin");
        //    entity.DisplayName = "管理员";
        //    entity.RoleID = 1;
        //    entity.IsEnable = true;
        //    entity.Insert();

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