學這個地方的時候就是一知半解,這次做這個項目讓我好好學習了一下。
http://www.cnblogs.com/dudu/tag/Entity%20Framework%20%E5%AE%9E%E8%B7%B5%E7%B3%BB%E5%88%97/感謝
這里的a=>a.B是lambda表示寫法,就是找到屬性B的意思。命名a不固定,可以隨意,q=>q.B也是可以的。但是B是A類的屬性,故習慣用小寫a。
Has方法:
- HasOptional:前者包含后者一個實例或者為null
- HasRequired:前者(A)包含后者(B)一個不為null的實例
- HasMany:前者包含后者實例的集合
With方法:
- WithOptional:后者(B)可以包含前者(A)一個實例或者null
- WithRequired:后者包含前者一個不為null的實例
- WithMany:后者包含前者實例的集合
摘自這里 這是較為好的理解方式。上面一句配置意思就是A類包含B類一個不為null的實例,B類包含A類一個實例,也可以不包含。最標准的一對一配置。
ok,現在看看我們上面Person類和PersonPhoto類的一對一的關系如何配置:
this.HasRequired(p => p.PhotoOf).WithOptional(p => p.Photo);
再跑下程序,數據庫就生成了,是一個一對一的關系。Person表可以沒有對應的PersonPhoto表數據,但是PersonPhoto表每一條數據都必須對應一條Person表數據。意思就是人可以沒有照片,但是有的照片必須屬於某個人。關系配置是這樣的效果,其實可以隨便改,也可以配置成每個人都必須有對應的照片。把上面的WithOptional改成WithRequired,對應到數據庫里就是null變成了not null。
思考:我們並沒有像之前一樣添加一個實體類就同時添加到BreakAwayContext類中,但是為何照樣能在數據庫中生成PersonPhotos表?
解答:添加到BreakAwayContext類中是讓數據庫上下文能跟蹤到這個類,方便進行CRUD(增查改刪)。這里我們不把PersonPhoto類添加到BreakAwayContext類中是因為我們並不會去單獨增刪改查PersonPhoto類,對PersonPhoto類的操作都是先找Person類,然后通過一對一的關系找到PersonPhoto類,這個比較符合實際情況。數據庫中能生成PersonPhotos就更好理解了,因為我們有這個實體類嘛。
繼續思考:到這里大家肯定又會想了,如果只需要加入主鍵類到BreakAwayContext類中,那么其他什么一對多,多對多的關系是不是都只要加主鍵表到BreakAwayContext類中呢?
繼續解答:還是需要根據實際情況考慮,上面的PersonPhoto類已經解釋過了,實際情況中不太可能單獨操作PersonPhoto類。一對多關系里Logding住宿類是外鍵表,這個想想也知道必須要讓數據庫上下文跟蹤到,因為我們太可能直接操作Lodging住宿類了。比如前台添加一個搜索住宿的功能,那是不是需要直接操作此外鍵表了呢?肯定需要了。所以還是需要根據實際情況考慮。這里僅是個人觀點,如有瑕疵,懇請指正。
http://www.th7.cn/Program/net/201308/146097.shtml