使实体类因更改而关闭

使实体类因更改而关闭

我有一个数据库关系,如下所示。域对象是基于LINQ to SQL ORM创建的。

付款包括现金付款和礼券付款。假设总购买金额为550。可以按以下组成部分付款

1 Gift Coupon Valued 3001 Gift Coupon Valued 200I Cash Currency Valued 50

http://img.mukewang.com/5d8c694300018f0f07540306.jpg

我正在使用ORM的“ InsertOnSubmit”功能插入新的付款记录。以下代码运行正常。但是,如果公司要使用信用卡引入新的付款方式,则需要更改“付款”域类。我如何仍使用ORM使付款类别对扩展开放,对变更封闭

注意:Payment类具有行为(例如GetTotalAmountCollected)。我正在尝试使“支付”类满足OCP。

注意:优惠券类型有特定的行为。如果优惠券发行日期小于2000年1月1日,则不应将其用于总金额的计算(即,优惠券值应为零)。另请参阅使用策略模式重构代码

注意:我正在使用.Net 4.0

参考:

  1. 将ObjectContext.AddObject与实体框架一起使用时出现错误

  2. 使用策略模式重构代码

  3. 比继承更偏爱组成?

  4. 代码优先与模型/数据库优先

  5. 使用Unity的策略模式和依赖注入

  6. 代表与OOP的C#策略设计模式

  7. 如何在C#中使用策略模式?

  8. 首先使用EF代码进行继承:第2部分–每个类型的表(TPT)http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每类型tpt.aspx

C#代码:

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();
    }}



一只名叫tom的猫
浏览 536回答 3
3回答

慕工程0101907

也许一种替代方法是在ORM中也利用继承。这样,付款实体中就不会有N个集合,而是每种类型一个。您将在同一集合中拥有所有子类型。所有这些加起来将代表整个付款。也许对名称取些不同会更容易。例如,让我们考虑Purchase的概念。购买应具有付款的集合。而付款可能是一个抽象类,从现金,优惠券,信用卡式,全部继承。以这种方式建立模型为解决特定问题提供了很多可能性。您可以将所有付款视为相同,而不必理会不同的收款,而且可以通过多态和双重调度进行大量控制。这样,如果出现新的付款类型,则您的模型将保持不变,您将只有一个新的子类型。如今,大多数ORM支持不同的持久性方案进行继承,这也将有助于保持数据结构的整洁。
打开App,查看更多内容
随时随地看视频慕课网APP