文章出處

回到目錄

注意,這里說的值對象是指在MongoDB實體類中的,并不是DDD中的值對象,不過,兩者也是聯系,就是它是對類的補充,自己本身沒有存在的價值,而在值對象中,也是不需要有主鍵Id的,這與DDD也是不謀而合的,也是可以理解的,因為它只是對主對象的一種補充說明,自己不存在任何意義,所以要主鍵也沒什么用,呵呵.

看一個MongoDB的值對象contact

    public class Person
    {

        public Person()
        {
            Contact = new Test.Contact();
            AddList = new List<Test.Address>();
            Id = MongoDB.Bson.ObjectId.GenerateNewId().ToString();
        }

        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime LastContact { get; set; }
        public DateTime Birthday { get; set; }
        public int Age { get; set; }

        public Address Address { get; set; }
        public List<Address> AddList { get; set; }
        /// <summary>
        /// 值對象
        /// </summary>
        public Contact Contact { get; set; }

    }

    public class Contact
    {
        public string Address { get; set; }
        public string PostCode { get; set; }
        public string Email { get; set; }
    }

大家看到Contact在Person中就是個值對象,它沒有Id,它只是對Person的補充,即,它是一種聯系方式的封裝,注意,在MongoDB實體中,建立主對象時,一定要為值對象和關系對象賦值,這是必要的,當然賦值后,值對象的值為空,這也是正常的,也是必要的,如果不為它

賦值,那么mongodb是不讓你去update的(c# driver是這樣的)

在對值對象賦值時,我們可以按字段賦值,也可以按對象去賦值,按對象賦值,它對將原對象覆蓋!

            var e1 = repository1.Find("556e8f2c2683c8105c9e501f");
            e1.Name = "wet";
            e1.Contact.PostCode = "100001";//為字段賦值
            e1.Contact = new Contact { Email = "bfyxzls@sina.com" };//為實體賦值,原實體被覆蓋
            repository1.Update(e1);

更新的結果,只有Email字段有值,其它字段被覆蓋,這是正常的

MongoDB等待大家去探索,研究...

回到目錄

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()