我想要在應用程序中跟蹤各種對象。這些對象是計算機,攝像機,交換機,路由器等。我希望各種對象從名爲Device的對象繼承,因爲它們都具有一些共同的屬性(即IP地址,MAC地址等),我喜歡創建對象使用設計師(Model First),但我不喜歡從模型更新數據庫的難度。基本上,我不喜歡丟棄數據庫並重新創建它,特別是一旦我開始填充數據庫。我嘗試的另一種方法是使用SQL Server中的SSMS創建數據庫,但是當我從數據庫創建POCO時,實體不會相互繼承。對我的情況有什麼好方法?我應該在實體框架中使用繼承還是有更好的方法?
回答
我想要的各種物體從所謂的設備中的對象繼承,因爲他們都將有一些共同的特性(即IP地址,MAC地址等)
你基本上是在談論哪些您將在EF中使用的繼承模式;或者模型如何映射到數據庫表。有在EF 3種主要類型的遺傳模式(見Inheritance Mapping: A Walkthrough Guide for Beginners):
- 表每層次
- 表每次類型
- 表每次具體類型
每個有利有弊(如表現)。但是,您還應該考慮到此模型是與數據庫相關的模型,在較大的項目中,您可能會創建第二層來處理業務邏輯。 DDD談到persistence models and domain models。同樣,您在這裏的選擇正在考慮以後的開發速度和可伸縮性以及性能。
我喜歡使用設計器(Model First)創建對象,但我不喜歡從模型更新數據庫的難度。
有4個,只有4 EF發展戰略(見Entity Framework Development Workflows):
我不喜歡有刪除該數據庫並重新創建它,尤其是當我開始填充數據庫
代碼第一次真的是非常,在這個非常好:
- 播種在代碼第一次允許您使用測試數據或實時數據填充數據庫,具體取決於您要部署到的位置。
- 遷移使您可以對數據庫執行非破壞性更新,並以完全可測試,完全可靠的方式遷移數據以進行實時部署。
這樣做與模型首先不幸的是,只是更難。我知道的唯一真正的解決方案是生成一個新的數據庫,並使用SQL比較(使用數據比較)工具來生成新數據庫中的數據。
選擇的模式和戰略
每一個戰略都有優點和缺點,每個遺傳模式是特定的發展戰略更好地利用。這些權衡是你自己判斷的,例如你可能會用有如果你有你繼承的現有數據庫,那麼你可能會使用數據庫優先,或者你可能更喜歡使用EF設計器,所以會使用模型優先。
模型首先(我的意思是使用EF設計器來定義模型)默認使用TPT策略。見EF Designer TPT Inheritance。如果你想要TPH,那麼你可以使用Model-first(見EF Designer TPH Inheritance),但是你有額外的工作要做; Code First更適合TPH。 TPC更難使用模型首先,和代碼第一次真的是最好的(唯一可行的),用於在EF 5
選項時,我從實體不相互
繼承數據庫中創建波蘇斯
這是很好的記住,模型處理類;該數據庫處理表中的存儲。從數據庫生成模型時,EF很難確定TPH或TPC繼承應該是什麼。它所能做的就是根據表格關聯在您的模型上創建一個「最佳猜測」。通過重命名屬性,更改關聯或應用繼承來生成模型後,您必須提供幫助。真的沒有其他的方式來做到這一點。對數據庫的更新也可能因此需要在模型上進行更多的工作。
你最好的辦法
也就是說,不幸的是,到意見。但是,如果你的主要要求是:
- 你想TPH或TPC(或混合策略)
- 你不想當你發出更新模型
則下降數據庫最符合這些技術要求的是Code First開發,具有遷移和播種。
Code First的缺點是必須編寫自己的POCO,並學習data annotation attributes。但是,請記住:
- 寫波蘇斯不是來自編寫數據庫表,所以不同的(而且一旦你習慣它是一樣快)
- 代碼首先是一個很大的使用自動化測試(例如DI和/或IoC在沒有涉及數據庫的情況下進行測試),所以稍後可以獲得好處
- 如果您要首先對數據庫進行大量的EDMX操作,或者每次刪除和更新數據庫時都要進行大量的工作首先使用模型,那麼你只是把時間和精力放在其他地方,而不是寫在POCOs
感謝您的澄清安迪。 –
- 1. 我應該使用std :: list還是有更好的方法?
- 2. 我應該使用分區還是有更好的方法?
- 3. PHP中的多繼承還是有更好的方法嗎?
- 4. ADO.NET實體框架比我使用的方法更好嗎?
- 5. 在實體框架中使用Find()與繼承框架
- 6. 瓶頸使用實體框架繼承
- 7. 如何使用實體框架繼承?
- 8. 實體框架多繼承?
- 9. 實體框架 - 繼承
- 10. 實體框架表繼承
- 11. 實體框架和繼承
- 12. 實體框架 - 繼承
- 13. 實體框架繼承
- 14. 實體框架繼承InverseProperty
- 15. 實體框架繼承
- 16. 實體框架4 - 繼承
- 17. 我應該在控制器中使用實體框架類還是模型類?
- 18. 實體框架繼承:TPT,TPH還是none?
- 19. 繼承與引用我的asp.net MVC與實體框架應用
- 20. 實體框架中的複雜繼承
- 21. 實體框架中的接口繼承
- 22. 實體框架中的POCO繼承
- 23. 我應該將方法添加到繼承db.Model的類中,還是應該將這些類繼承爲新類?
- 24. 如何在實體框架中使用繼承類的字段
- 25. 我應該使用從可實例化類繼承的單例類還是另一種更好的模式?
- 26. 具有繼承權限的接入實體框架實體
- 27. 更新繼承實體,實體框架7
- 28. 從實體框架對象的繼承
- 29. 是否有更好的方法來使用實體框架+ IDataErrorInfo實現模型驗證比這個更好?
- 30. 在實體框架中更新方法
我會做一個「有A」關係,而不是「是A」關係。在您的計算機中,攝像頭,交換機,路由器等表中添加一個帶有外鍵的列到公共表。您可以將接口添加到每個類(如ICommon),並仍將所有對象一起使用。 –
我不應該做關係,只是做接口? –
如果你在生成的SQL上做一個diff,你可以(仔細地)手動對數據庫進行修改而不必丟棄任何東西。給任何新的字段一個臨時默認值,以便現有的行將獲得一個值,然後刪除默認值。 (在進行更改之前進行備份)。 –