Entity Framework 實體之間的關系總結——1:0,1:1,1:n,m:n關系


學這個地方的時候就是一知半解,這次做這個項目讓我好好學習了一下。

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方法:

  1. HasOptional:前者包含后者一個實例或者為null
  2. HasRequired:前者(A)包含后者(B)一個不為null的實例
  3. HasMany:前者包含后者實例的集合

With方法:

  1. WithOptional:后者(B)可以包含前者(A)一個實例或者null
  2. WithRequired:后者包含前者一個不為null的實例
  3. 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM