2009-07-09 80 views
3

ORM和現有數據庫在數據庫本身內強制執行有多少約束(特別是主鍵之外的唯一鍵約束/唯一索引)兼容性如何兼容? (通常這些是已有的數據庫,由許多傳統應用程序共享)但是良好的數據庫建模實踐是在數據庫中定義儘可能多的約束作爲對應用程序的雙重檢查另外請注意,數據庫引擎I我正在使用不支持延遲約束檢查。)ORM和數據庫約束

我問的原因是我已經研究過的ORM,NHibernate和Linq to SQL,在數據庫唯一性限制。例如,刪除一行並重新插入具有相同業務關鍵字的行會導致外鍵異常。 (有些微妙,難以避免的例子。)ORM觀察主鍵和外鍵約束,但往往忽略了獨特的約束。

我知道有一些解決方法,比如NHibernate的flush方法。但是,我覺得這是一個非常漏洞的抽象,並且很難設計關於分離問題的應用程序。理想情況下,所有對象都可以通過子程序在內存中進行操作,然後主例程可以負責實際同步數據庫的調用。這隔離了更新並允許自定義邏輯在實際提交到數據庫之前檢查所有更新。

以正確的順序執行命令是非平凡的。看到我的問題here。儘管如此,我期待對流行的ORM中的常見病例有更好的支持。這對於將ORM引入現有環境看起來非常重要。

使用ORM技術的經驗是什麼?

回答

2

這當然IMHO的...

ORM一般對待數據庫作爲僅用於數據的存儲介質和朝向保持在所述「O」側的約束/業務邏輯,而不是「R」面向側。我還沒有看到任何使用一些更「硬核」關係數據庫概念的ORM產品,例如備用密鑰,複合唯一索引和獨佔子類型。從某種意義上說,ORM使數據庫成爲二等公民。

打電話給我老式的,但ORM似乎很適合閱讀數據,但爲了將數據寫回非重要的關係設計,我總是發現它不夠用。我更喜歡通過SQL和/或存儲過程來完成所有更新。

0

好的ORM和NHibernate是一個,如果數據庫映射正確,將強制執行參照完整性和正確的命令執行。據我所知,他們都不支持檢查或獨特的約束。檢查約束是應該在業務對象中執行的業務規則。我通常只使用檢查約束和/或觸發器強制實施關鍵業務規則(即業務會虧本,和/或如果違反這些規則,我會失去工作)。

唯一約束通常代表一個備用關鍵。對於ORM,通常使用代理鍵(標識)作爲主鍵,並對自然鍵實施唯一約束。 ORM實施獨特的約束檢查將是一項挑戰,因爲它在每次插入或更新之前都需要選擇和鎖定。通常,最佳做法是始終在事務中執行操作,如果事務失敗並可向用戶提供有意義的錯誤消息,則該事務可以回滾。

例如,刪除一行並重新插入具有相同業務關鍵字的行會導致外鍵異常。

你是否試圖在單個ISession的範圍內做到這一點?我可以看到這是有問題的。