使實體類因更改而關閉我有一個數(shù)據(jù)庫關系,如下所示。域對象是基于LINQ to SQL ORM創(chuàng)建的。付款包括現(xiàn)金付款和禮券付款。假設總購買金額為550??梢园匆韵陆M成部分付款1 Gift Coupon Valued 3001 Gift Coupon Valued 200I Cash Currency Valued 50我正在使用ORM的“ InsertOnSubmit”功能插入新的付款記錄。以下代碼運行正常。但是,如果公司要使用信用卡引入新的付款方式,則需要更改“付款”域類。我如何仍使用ORM使付款類別對擴展開放,對變更封閉?注意:Payment類具有行為(例如GetTotalAmountCollected)。我正在嘗試使“支付”類滿足OCP。注意:優(yōu)惠券類型有特定的行為。如果優(yōu)惠券發(fā)行日期小于2000年1月1日,則不應將其用于總金額的計算(即,優(yōu)惠券值應為零)。另請參閱使用策略模式重構代碼。注意:我正在使用.Net 4.0參考:將ObjectContext.AddObject與實體框架一起使用時出現(xiàn)錯誤使用策略模式重構代碼比繼承更偏愛組成?代碼優(yōu)先與模型/數(shù)據(jù)庫優(yōu)先使用Unity的策略模式和依賴注入代表與OOP的C#策略設計模式如何在C#中使用策略模式?首先使用EF代碼進行繼承:第2部分–每個類型的表(TPT)http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每類型tpt.aspxC#代碼:public class PaymentAppService{
public RepositoryLayer.ILijosPaymentRepository Repository { get; set; }
public void MakePayment()
{
DBML_Project.Payment paymentEntity = new DBML_Project.Payment();
paymentEntity.PaymentID = 1;
paymentEntity.PaymentType = "PurchaseP";
DBML_Project.CashPayment cashObj = new DBML_Project.CashPayment();
cashObj.CashPaymentID = 1;
cashObj.CurrencyNumber = 123;
cashObj.CurrencyValue = 100;
DBML_Project.GiftCouponPayment giftCouponObj = new DBML_Project.GiftCouponPayment();
giftCouponObj.GiftCouponPaymentID = 1;
giftCouponObj.CouponValue = 200;
giftCouponObj.CouponNumber = 124;
paymentEntity.CashPayments = new System.Data.Linq.EntitySet<DBML_Project.CashPayment>();
paymentEntity.CashPayments.Add(cashObj);
paymentEntity.GiftCouponPayments = new System.Data.Linq.EntitySet<DBML_Project.GiftCouponPayment>();
paymentEntity.GiftCouponPayments.Add(giftCouponObj);
Repository.InsertEntity(paymentEntity);
Repository.SubmitChanges();
}}
3 回答

慕工程0101907
TA貢獻1887條經(jīng)驗 獲得超5個贊
也許一種替代方法是在ORM中也利用繼承。這樣,付款實體中就不會有N個集合,而是每種類型一個。您將在同一集合中擁有所有子類型。所有這些加起來將代表整個付款。
也許對名稱取些不同會更容易。例如,讓我們考慮Purchase的概念。購買應具有付款的集合。而付款可能是一個抽象類,從現(xiàn)金,優(yōu)惠券,信用卡式,全部繼承。
以這種方式建立模型為解決特定問題提供了很多可能性。您可以將所有付款視為相同,而不必理會不同的收款,而且可以通過多態(tài)和雙重調度進行大量控制。
這樣,如果出現(xiàn)新的付款類型,則您的模型將保持不變,您將只有一個新的子類型。
如今,大多數(shù)ORM支持不同的持久性方案進行繼承,這也將有助于保持數(shù)據(jù)結構的整潔。
- 3 回答
- 0 關注
- 565 瀏覽
添加回答
舉報
0/150
提交
取消