日期:2014-05-20  浏览次数:20725 次

2个关于ORM只更新制定属性的设计设想
2个关于ORM只更新制定属性的设计设想
项目的数据访问层是参考李天平的东软代码生成工具而设计的,也是通过代码生成工具来生成数据访问层。

数据访问层到现在已经使用快2年时间,应该还算稳定。目前存在一个调优的问题。项目在后期为了加快数据访问,给数据库表建立了一些索引,虽然访问速度被加速,但在更新时的速度缺降低下来了。因为每次更新数据是数据库对索引的更新也需要花很多时间。
更新索引的原因是因为数据访问层在更新数据时除了主键ID未更新过以外,其它字段的数据都被更新了。但实际的运营情况是,每次数据更新时,对应的索引键的数据并为更新过。

针对项目存在的问题,并为了让项目能平滑升级,我设计2种更新模式:
1)给实体类的每个属性(数据库字段)增加一个内部的变量,用于记录数据库里的数值,并在每次更新数据库时做判断,如果实体类的数值被修改过,则对该数据做数据库修改的提交。
2)修改访问层的接口,增加一个本次更新列的参数,通过制定不同的更新列来。

我想在这里请教各位,使用那种模式做修改对已有项目有利,那种模式对于全新项目有利。或者各位还有什么比较好的方法对局部数据做更新。

三种数据更新的方法
C# code


    public class NewAccessCastle
    {
        /// <summary>
        ///  旧的更新语句
        /// </summary>
        public void Update(Castle model)
        {
            SqlParameter[] parameters = GetUpdateParamter(model);

            DbHelperSQL.ExecuteSql(updateSQL, parameters);
        }

        const string updateSQL = @"    UPDATE Castle SET 
    [PlayerID]=@PlayerID,[CastleID]=@CastleID,[Resource]=@Resource,[Building]=@Building
    WHERE [ID]=@ID";

        private static SqlParameter[] GetUpdateParamter(Castle model)
        {
            SqlParameter[] parameters = {
                    new SqlParameter("@ID", SqlDbType.Int),
                    new SqlParameter("@PlayerID", SqlDbType.Int),
                    new SqlParameter("@CastleID", SqlDbType.Int),
                    new SqlParameter("@Resource", SqlDbType.NVarChar),
                    new SqlParameter("@Building", SqlDbType.NVarChar)};
            parameters[0].Value = model.ID;
            parameters[1].Value = model.PlayerID;
            parameters[2].Value = model.CastleID;
            parameters[3].Value = model.Resource;
            parameters[4].Value = model.Building;

            return parameters;
        }

        /// <summary>
        /// 通过新旧参数判断来更新对应数据库字段
        /// </summary>
        /// <param name="model"></param>
        public void Update1(Castle model)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();
            StringBuilder sql = new StringBuilder();
            sql.Append("UPDATE Castle Set ");
         
            if (model.PlayerID != model.source_PlayerID)
            {
                sql.Append("[PlayerID]=@PlayerID,");
                parameters.Add(new SqlParameter( "@PlayerID", model.PlayerID));
            }

            if (model.CastleID != model.source_CastleID)
            {
                sql.Append("[CastleID]=@CastleID,");
                parameters.Add(new SqlParameter("@CastleID", model.CastleID));
            }

            if (model.Building != model.source_Building)
            {
                sql.Append("[Building]=@Building,");
                parameters.Add(new SqlParameter("@Building", model.Building));
            }

            if (model.Resource != model.source_Resource)
            {
                sql.Append("[Resource]=@Resource,");
                parameters.Add(new SqlParameter("@Resource", model.Resource));
            }

            if (parameters.Count > 0)
            {
                sql.Remove(sql.Length - 1, 1);
                sql.Append(" where [ID]=@ID");
                parameters.Add(new SqlParameter("@ID", model.ID));

                DbHelperSQL.ExecuteSql(sql.ToString(), parameters.ToArray());
            }
        }

        public enum emUpdateParameter
        {
            PlayerID,
            CastleID,
            Building,
            Resource,
        }

        /// <summary>
        /// 通过更新接口参数来确定具体的更新数据
        /// </summary>
        /// <param name="model"></param>
        /// <param name="changeParameter"></param>
        public void Update2(Castle model, params emUpdateParameter[] changeParameter)
        {
            if (changeParameter == null || changeParameter.Length == 0)
            {
                Update(model);
                return;
            }
                

            List<SqlParameter> parameters = new List<SqlParameter>();
            StringBuilder sql = new StringBuilder();
            sql.Append("UPDATE Castle Set ");

            foreach (var change in changeParameter)
            {
                switch (change)
                {
                    case emUpdateParameter.PlayerID:
                        sql.Append("[PlayerID]=@PlayerID,");
                        parameters.Add(new SqlParameter("@PlayerID", model.PlayerID));
                        break;
                    case emUpdateParameter.CastleID:
                        sql.Append("[CastleID]=@CastleID,");
                        parameters.Add(new SqlParameter("@CastleID", model.CastleID));
                        break;
                    case emUpdateParameter.Building:
                        sql.Append("[Building]=@Building,");
                        parameters.Add(new SqlParameter("@Building", model.Building));
                        break;
                    case emUpdateParameter.Resource:
                        sql.Append("[Resource]=@Resource,");
                        parameters.Add(new SqlParameter("@Resource", model.Resource));
                        break;
                    default:
                        break;
                }
            }

            sql.Remove(sql.Length - 1, 1);
            sql.Append(" where [ID]=@ID");
            parameters.Add(new SqlParameter("@ID", model.ID));

            DbHelperSQL.ExecuteSql(sql.ToString(), parameters.ToArray());
            
        }
    }