Exemple #1
0
        /// <summary>
        /// 贪婪加载某个属性
        /// </summary>
        /// <param name="property">需要贪婪加载的托管属性。可以是一个引用属性,也可以是一个组合子属性。</param>
        private void EagerLoad(ConcreteProperty property)
        {
            if (this.EagerLoadOptions == null)
            {
                this.EagerLoadOptions = new EagerLoadOptions();
            }

            this.EagerLoadOptions.CoreList.Add(property);
        }
        public override void RefreshRedundancy(ConcreteProperty redundancy)
        {
            /*********************** 代码块解释 *********************************
             * http://blog.csdn.net/peng790/article/details/6585202
             *
             * 假定场景是:
             * D(CRef,AName) -> C(BRef) -> B(ARef) -> A(Name);
             * 则对应生成的 SQL 是:
             * update D set AName = @AName where CId in (
             *     select id from C where BId in (
             *          select id from B where AId = @AId
             *     )
             * )
             * 如果 B、C 表也有冗余属性,对应的 SQL 则是:
             * update B Set AName = @AName where AId = @AId
             * update C set AName = @AName where BId in (
             *     select id from B where AId = @AId
             * )
             *
            **********************************************************************/

            //update B set AName = A.Name FROM A WHERE A.ID = b.AId
            //update C set AName = A.Name FROM A INNER JOIN B ON A.Id = B.AId WHERE B.Id = C.BId
            //update D set AName = A.Name FROM A INNER JOIN B ON A.Id = B.AId INNER JOIN C ON B.Id = c.BId WHERE C.Id = D.CId

            ////准备所有用到的 DbTable
            //var table = RdbTableFinder.TableFor(path.Redundancy.Owner);
            //var refTables = new RefPropertyTable[refPathes.Count];
            //for (int i = 0, c = refPathes.Count; i < c; i++)
            //{
            //    var refProperty = refPathes[i];
            //    var refTable = RdbTableFinder.TableFor(refProperty.Owner);
            //    if (refTable == null)
            //    {
            //        ORMHelper.ThrowBasePropertyNotMappedException(refProperty.Name, refProperty.Owner);
            //    }

            //    refTables[i] = new RefPropertyTable
            //    {
            //        RefProperty = refProperty,
            //        OwnerTable = refTable
            //    };
            //}

            //var sql = new ConditionalSql();
            ////SQL: UPDATE D SET AName = {0} WHERE
            //sql.Append("UPDATE ").AppendQuoteName(table)
            //    .Append(" SET ").AppendQuote(table, table.Translate(redundancy.Property))
            //    .Append(" = ").AppendParameter(newValue).Append(" WHERE ");

            //int quoteNeeded = 0;
            //if (refTables.Length > 1)
            //{
            //    //中间的都生成 Where XX in
            //    var inWherePathes = refTables.Take(refTables.Length - 1).ToArray();
            //    for (int i = 0; i < inWherePathes.Length; i++)
            //    {
            //        var inRef = inWherePathes[i];

            //        //SQL: CId In (
            //        sql.AppendQuote(table, inRef.OwnerTable.Translate(inRef.RefProperty.Property))
            //            .Append(" IN (").AppendLine();
            //        quoteNeeded++;

            //        var nextRef = refTables[i + 1];

            //        //SQL: SELECT Id FROM C WHERE
            //        var nextRefOwnerTable = nextRef.OwnerTable;
            //        sql.Append(" SELECT ").AppendQuote(nextRefOwnerTable, nextRefOwnerTable.PKColumn.Name)
            //            .Append(" FROM ").AppendQuoteName(nextRefOwnerTable)
            //            .Append(" WHERE ");
            //    }
            //}

            ////最后一个,生成SQL: BId = {1}
            //var lastRef = refTables[refTables.Length - 1];
            //sql.AppendQuote(table, lastRef.OwnerTable.Translate(lastRef.RefProperty.Property))
            //    .Append(" = ").AppendParameter(lastRefId);

            //while (quoteNeeded > 0)
            //{
            //    sql.AppendLine(")");
            //    quoteNeeded--;
            //}

            ////执行最终的 SQL 语句
            //using (var dba = _dataProvider.CreateDbAccesser())
            //{
            //    dba.ExecuteText(sql, sql.Parameters);
            //}
        }
        protected override void UpdateRedundancy(Entity entity, ConcreteProperty redundancy, object newValue, IList<ConcreteProperty> refPathes, object lastRefId)
        {
            /*********************** 代码块解释 *********************************
             *
             * 假定场景是:
             * refPathes: D(CRef,AName) -> C(BRef) -> B(ARef),
             * lastRefId: AId。(B.ARef 是最后一个引用属性)
             * 则对应生成的 SQL 是:
             * update D set AName = @AName where CId in (
             *     select id from C where BId in (
             *          select id from B where AId = @AId
             *     )
             * )
             * 如果 B、C 表也有冗余属性,对应的 SQL 则是:
             * update B Set AName = @AName where AId = @BId
             * update C set AName = @AName where BId in (
             *     select id from B where AId = @AId
             * )
             *
            **********************************************************************/

            //准备所有用到的 DbTable
            var table = RdbTableFinder.TableFor(redundancy.Owner);
            var refTables = new RefPropertyTable[refPathes.Count];
            for (int i = 0, c = refPathes.Count; i < c; i++)
            {
                var refProperty = refPathes[i];
                var refTable = RdbTableFinder.TableFor(refProperty.Owner);
                if (refTable == null)
                {
                    ORMHelper.ThrowBasePropertyNotMappedException(refProperty.Name, refProperty.Owner);
                }

                refTables[i] = new RefPropertyTable
                {
                    RefProperty = refProperty,
                    OwnerTable = refTable
                };
            }

            var sql = new ConditionalSql();
            //SQL: UPDATE D SET AName = {0} WHERE
            sql.Append("UPDATE ").AppendQuoteName(table)
                .Append(" SET ").AppendQuote(table, table.Translate(redundancy.Property))
                .Append(" = ").AppendParameter(newValue).Append(" WHERE ");

            int quoteNeeded = 0;
            if (refTables.Length > 1)
            {
                //中间的都生成 Where XX in
                var inWherePathes = refTables.Take(refTables.Length - 1).ToArray();
                for (int i = 0; i < inWherePathes.Length; i++)
                {
                    var inRef = inWherePathes[i];

                    //SQL: CId In (
                    sql.AppendQuote(table, inRef.OwnerTable.Translate(inRef.RefProperty.Property))
                        .Append(" IN (").AppendLine();
                    quoteNeeded++;

                    var nextRef = refTables[i + 1];

                    //SQL: SELECT Id FROM C WHERE
                    var nextRefOwnerTable = nextRef.OwnerTable;
                    sql.Append(" SELECT ").AppendQuote(nextRefOwnerTable, nextRefOwnerTable.PKColumn.Name)
                        .Append(" FROM ").AppendQuoteName(nextRefOwnerTable)
                        .Append(" WHERE ");
                }
            }

            //最后一个,生成SQL: BId = {1}
            var lastRef = refTables[refTables.Length - 1];
            sql.AppendQuote(table, lastRef.OwnerTable.Translate(lastRef.RefProperty.Property))
                .Append(" = ").AppendParameter(lastRefId);

            while (quoteNeeded > 0)
            {
                sql.AppendLine(")");
                quoteNeeded--;
            }

            //执行最终的 SQL 语句
            using (var dba = _dataProvider.CreateDbAccesser())
            {
                dba.ExecuteText(sql, sql.Parameters);
            }
        }
 /// <summary>
 /// 更新某个冗余属性
 /// </summary>
 /// <param name="entity">The entity.</param>
 /// <param name="redundancy">更新指定的冗余属性</param>
 /// <param name="newValue">冗余属性的新值</param>
 /// <param name="refPathes">从冗余属性声明类型开始的一个引用属性集合,
 /// 将会为这个集合路径生成更新的 Where 条件。</param>
 /// <param name="lastRefId">引用路径中最后一个引用属性对应的值。这个值将会作为 Where 条件的值。</param>
 protected abstract void UpdateRedundancy(Entity entity, ConcreteProperty redundancy, object newValue, IList<ConcreteProperty> refPathes, object lastRefId);