2009-08-16 83 views
2

實際框架的實際框架是它的拖放方式,用於組成應用程序的整個模型層。你選擇表格,它加入他們,你就完成了。如果更新數據庫scheda,請右鍵單擊 - >更新,然後重新完成。實體類似於框架的ORM不適用於.NET

這在我看來英里提前competiting的ORM,如XML的混亂(n)的休眠要求或難以更新Django模型。如果沒有專注於有時可能對映射過程進行更多控制的事實,那麼對於其他(主要是開放源代碼,如python或php)編程語言或框架,是否存在類似的一鍵式(或單一命令)解決方案? ?

謝謝

+3

實際上,有價值的框架就像NHibernate一樣使用「混亂」的XML - 它只是由Visual Studio自動創建的。所以看起來你正在尋找一個具有相似功能而不是ORM的IDE。 – UpTheCreek 2009-08-18 07:52:41

回答

2

SQLAlchemy數據庫反射讓你在那裏的一半。你仍然需要聲明你的類和它們之間的關係。其實你也可以很容易地自動生成這些類,但是你仍然需要以某種方式命名關係,所以你可以手動地聲明這些類。

代碼設置你的數據庫將是這個樣子:

from sqlalchemy import create_engine, MetaData 
from sqlalchemy.ext.declarative import declarative_base 

metadata = MetaData(create_engine(database_url), reflect=True) 
Base = declarative_base(metadata)  

class Order(Base): 
    __table__ = metadata.tables['orders'] 

class OrderLine(Base): 
    __table__ = metadata.tables['orderlines'] 
    order = relation(Order, backref='lines') 

在生產代碼中,你可能想以某種方式緩存反映數據庫的元數據。比如醃到一個文件:

from cPickle import dump, load 
import os 

if os.path.exists('metadata.cache'): 
    metadata = load(open('metadata.cache')) 
    metadata.bind = create_engine(database_url) 
else: 
    metadata = MetaData(create_engine(database_url), reflect=True) 
    dump(metadata, open('metadata.cache', 'w')) 
2

我不喜歡「拖放」創建數據訪問代碼。

乍一看似乎很容易,但你做出改變的數據庫,並更新數據訪問代碼。這就是它變得困難的地方,因爲你經常不得不重做你之前完成的工作,或者手工編輯拖放設計器創建的代碼。通常,當您使用拖放設計器對一個字段映射進行更改時,輸出文件具有不相關的行更改,因此您無法使用源代碼控制系統來確認您是否進行了預期的更改(而不會更改其他任何內容) 。

但是不必創建/編輯XML配置文件,每次折射你的代碼或更改數據庫架構,必須更新映射文件的時間是不是很好。開始使用映射文件並追蹤看似簡單的問題可能需要的時間也很困難。

還有其他兩個選項:

使用代碼生成像CodeSmith附帶了很多ORM系統模板。當(不是如果)你需要定製輸出時,你可以編輯模板,但簡單的情況是照顧你的。每次更改數據庫模式並獲得可重複結果時,您只需重新運行代碼生成器即可。

和/或使用流利的接口(例如Fluent NHibernate)來配置你的ORM系統,這避免了需要XML配置文件,並可以使用命名約定來場鏈接欄等,這將是很難大多數情況下,從一個拖放設計師開始,但如果你確實匹配了代碼或數據庫的重構,那麼就需要長期支付。

另一個選擇是使用一個模型,您可以從中生成數據庫和代碼。 「模型」是您的源代碼,並保持在版本控制之下。這被稱爲「模型驅動開發」,如果您有很多具有更簡單模式的類,那麼可以很好,因爲您只需要爲每個模式創建一次模板。

+0

EF設計師其實深思熟慮。您可以針對您在數據庫中所做的更改運行更新,並且不會混淆對模式/對象所做的手動更改。 – ADB 2009-08-24 18:52:41

0

我聽說iBattis很好。當他們的程序員團隊不能理解Hibernate(時間問題)時,一些公司會回到iBattis。

個人而言,我還是喜歡Linq2Sql。是的,第一次有人需要刪除和重新整理表格看起來工作太多,但實際上並非如此。當你保存的時候它並沒有更新你的課程代碼真的很痛苦,但是你只需控制你的表格並將它們拖回去。總重拍非常快速且無痛。它創建的類非常簡單。如果你喜歡使用SP的CRUD,你甚至可以創建多個表格實體。

將SP鏈接到CRUD與EF類似:只需使用與您的表相同的參數設置SP,然後將其拖到您的表上,然後將其與數據類型相匹配。

很多人走出自己的路不好走的IQueryable從倉庫了,但你可以 IQueryable的那麼什麼是你鏈接在LINQ2SQL,不算太糟糕。

想想吧,我想知道是否有辦法限制關係(和外鍵)。