Создание класса сущностей закрытым для изменений

У меня есть связь с базой данных, как показано ниже. Доменные объекты создаются на основе LINQ to SQL ORM.

Платеж состоит из наличных и подарочных купонов. Предположим, что общая сумма покупки составляет 550. Это может быть оплачено как следующие компоненты

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50

enter image description here

Я вставляю новые записи о платежах, используя & # x201C; InsertOnSubmit & # x201D; функция ОРМ. Следующий код работает нормально. Однако, если компания вводит новый платежный компонент с помощью кредитной карты, мне нужно внести изменения в мой & # x201C; Payment & # x201D; Доменный класс. Как мне сделать класс оплатыOpen for Extension and Closed for Changes все еще используюORM?

Примечание: класс оплаты имеетbehaviors (Например, GetTotalAmountCollected). Я пытаюсь сделать "Платеж" класс, чтобы удовлетворить OCP.

Примечание: есть конкретныйbehavior для типа купона. Если дата выдачи купона меньше 1/1/2000, ее не следует использовать при расчете общей суммы (т. Е. CouponValue должен быть равен нулю). обращатьсяРефакторинг кода с использованием шаблона стратегии также.

Примечание: я использую.Net 4.0

Ссылка:

Getting an error when using ObjectContext.AddObject with Entity Framework Refactoring code using Strategy Pattern Prefer composition over inheritance? Code-first vs Model/Database-first Strategy Pattern and Dependency Injection using Unity C# Strategy Design Pattern by Delegate vs OOP How to use the Strategy Pattern with C#? Inheritance with EF Code First: Part 2 – Table per Type (TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-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();
    }
}

Repository:

public class LijosPaymentRepository : ILijosPaymentRepository
{
    public System.Data.Linq.DataContext MyDataContext { get; set; }

    public void InsertEntity(DBML_Project.Payment payment)
    {
        //Insert the entity
        MyDataContext.GetTable<DBML_Project.Payment>().InsertOnSubmit(payment);
    }

    public void SubmitChanges()
    {
        MyDataContext.SubmitChanges();
    }
}

Ответы на вопрос(4)

Ваш ответ на вопрос