2013-05-18 26 views
4

我想要在應用程序中跟蹤各種對象。這些對象是計算機,攝像機,交換機,路由器等。我希望各種對象從名爲Device的對象繼承,因爲它們都具有一些共同的屬性(即IP地址,MAC地址等),我喜歡創建對象使用設計師(Model First),但我不喜歡從模型更新數據庫的難度。基本上,我不喜歡丟棄數據庫並重新創建它,特別是一旦我開始填充數據庫。我嘗試的另一種方法是使用SQL Server中的SSMS創建數據庫,但是當我從數據庫創建POCO時,實體不會相互繼承。對我的情況有什麼好方法?我應該在實體框架中使用繼承還是有更好的方法?

+1

我會做一個「有A」關係,而不是「是A」關係。在您的計算機中,攝像頭,交換機,路由器等表中添加一個帶有外鍵的列到公共表。您可以將接口添加到每個類(如ICommon),並仍將所有對象一起使用。 –

+0

我不應該做關係,只是做接口? –

+0

如果你在生成的SQL上做一個diff,你可以(仔細地)手動對數據庫進行修改而不必丟棄任何東西。給任何新的字段一個臨時默認值,以便現有的行將獲得一個值,然後刪除默認值。 (在進行更改之前進行備份)。 –

回答

5

我想要的各種物體從所謂的設備中的對象繼承,因爲他們都將有一些共同的特性(即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繼承應該是什麼。它所能做的就是根據表格關聯在您的模型上創建一個「最佳猜測」。通過重命名屬性,更改關聯或應用繼承來生成模型後,您必須提供幫助。真的沒有其他的方式來做到這一點。對數據庫的更新也可能因此需要在模型上進行更多的工作。

你最好的辦法

也就是說,不幸的是,到意見。但是,如果你的主要要求是:

  1. 你想TPH或TPC(或混合策略)
  2. 你不想當你發出更新模型

則下降數據庫最符合這些技術要求的是Code First開發,具有遷移和播種。

Code First的缺點是必須編寫自己的POCO,並學習data annotation attributes。但是,請記住:

  • 寫波蘇斯不是來自編寫數據庫表,所以不同的(而且一旦你習慣它是一樣快)
  • 代碼首先是一個很大的使用自動化測試(例如DI和/或IoC在沒有涉及數據庫的情況下進行測試),所以稍後可以獲得好處
  • 如果您要首先對數據庫進行大量的EDMX操作,或者每次刪除和更新數據庫時都要進行大量的工作首先使用模型,那麼你只是把時間和精力放在其他地方,而不是寫在POCOs
+0

感謝您的澄清安迪。 –