中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

MongoDB學習筆記(ji)~Update方法(fa)更新集合(he)屬性后(hou)的怪問題

回到目錄

在對(dui)MongoDB進行封裝后,對(dui)于Update更(geng)新(xin)對(dui)象(xiang)里的(de)(de)集合屬性時(shi)出現了(le)(le)一個現象(xiang),讓人感到(dao)很惡心,人家更(geng)新(xin)前是個美麗的(de)(de)Array,但是更(geng)新(xin)之后集合對(dui)象(xiang)變成了(le)(le)鍵(jian)值對(dui),鍵(jian)是集合的(de)(de)類型名稱,值是真(zhen)實(shi)的(de)(de)數組(zu)值,哈哈,這(zhe)個問題(ti)起初困擾(rao)了(le)(le)我很久,今天(tian)終于豁然開朗了(le)(le),原來是Update方法的(de)(de)問題(ti),呵呵!

看原來的值

看更新后的變質的值

再看看我們的Update方法

    public Task UpdateAsync(TEntity item)
        {
            var query = new QueryDocument("_id", typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString());
            var fieldList = new List<UpdateDefinition<TEntity>>();
            foreach (var property in typeof(TEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                if (property.Name != EntityKey)//更(geng)新集中不能有實體鍵_id
                {
                    fieldList.Add(Builders<TEntity>.Update.Set(property.Name, property.GetValue(item)));
                }
            }

            return ForWait(() => _table.UpdateOneAsync(query, Builders<TEntity>.Update.Combine(fieldList)));

        }

確實沒看出什么問題來,但最后它生成的代碼是以_t和_v為鍵值的值,出現這種情況的原因是你的代碼沒有被mongo識別,就像之前我們為mongo傳decimal類型的數據一樣,它也會出現同樣的情況。

解決方法

將復(fu)(fu)雜(za)類(lei)型進行(xing)拆封和組裝(zhuang),讓它(ta)被mongo所認識,這樣update操作就可(ke)以(yi)按(an)著我們(men)預(yu)想的完成了(le),值(zhi)得注意(yi)的是,如果你的對(dui)象里有(you)(you)復(fu)(fu)雜(za)類(lei)型,如Person類(lei)里有(you)(you)Address類(lei)型,那么在賦值(zhi)時我們(men)拼成以(yi)下這樣

Address.City="北(bei)京"

而如果你的對象里屬(shu)性為(wei)集(ji)合類型,那(nei)就更(geng)麻(ma)煩一(yi)些,除了做上面的拆封外,還要關注(zhu)它的索(suo)引號(hao),如Person類里有AddList集(ji)合屬(shu)性,那(nei)么在賦值(zhi)時(shi)我們拼(pin)成(cheng)以下這樣

AddList.0.City="北(bei)京(jing)"

下面公開大叔的Update代碼

        public Task UpdateAsync(TEntity item)
        {
            var query = new QueryDocument("_id", typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString());
            var fieldList = new List<UpdateDefinition<TEntity>>();
            foreach (var property in typeof(TEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                //非空的復雜類(lei)型
                if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && property.GetValue(item) != null)
                {

                    if (typeof(IList).IsAssignableFrom(property.PropertyType))
                    {
                        #region 集合類型
                        foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                        {
                            if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string))
                            {
                                var arr = property.GetValue(item) as IList;
                                if (arr != null && arr.Count > 0)
                                {
                                    for (int s = 0; s < arr.Count; s++)
                                    {
                                        foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                                        {
                                            //propertyName.index.innerPropertyName
                                            fieldList.Add(Builders<TEntity>.Update.Set(property.Name + "."+ s + "." + subInner.Name, subInner.GetValue(arr[s])));
                                        }
                                    }
                                }
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        #region 實體類型
                        //復雜類型,導航屬性,類對象和(he)集合對象 
                        foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                        {
                            fieldList.Add(Builders<TEntity>.Update.Set(property.Name + "." + sub.Name, sub.GetValue(property.GetValue(item))));
                        }
                        #endregion
                    }
                }
                else //簡(jian)單類(lei)型
                {
                    if (property.Name != EntityKey)//更新(xin)集中不能有實體鍵_id
                    {
                        fieldList.Add(Builders<TEntity>.Update.Set(property.Name, property.GetValue(item)));
                    }
                }
            }

            return ForWait(() => _table.UpdateOneAsync(query, Builders<TEntity>.Update.Combine(fieldList)));

        }

希望本(ben)文章對使(shi)用MongoDB的學生來說有所(suo)幫助(zhu)!

回到目錄

 

posted @ 2015-05-29 15:08  張占嶺  閱讀(5701)  評論(3)    收藏  舉報