Master Detail, код слоя MVC Model, для лучшего профессионального подхода - PullRequest
0 голосов
/ 29 декабря 2011

Я пытаюсь написать редактирование записи основной детали в модели Asp.net MVC.
Во-первых, позвольте мне показать вам два моих класса моделей.

Имя класса = Model \ OrderDetailRepository.cs

public class OrderDetailRepository : IOrderDetailRepository
{
    NorthwindEntities DB = new NorthwindEntities();

    public IQueryable<Order_Detail> GetOrderDetailByOrderID(int OrderID)
    {
        return DB.Order_Details.Where(tableX => tableX.OrderID == OrderID);
    }

    public void InsertOrderDetail(Order_Detail _Order_Detail)
    {
        DB.Order_Details.AddObject(_Order_Detail);
    }


    public void UpdateOrderDetail(Order_Detail _Order_Detail)
    {
        DB.ObjectStateManager.ChangeObjectState(_Order_Detail, EntityState.Modified);
    }

    public void DeleteOrderDetailByOrderID(int OrderID)
    {
        Order_Detail  _Order_Detail = DB.Order_Details.SingleOrDefault(x => x.OrderID == OrderID);

        if (_Order_Detail != null)
            DB.Order_Details.DeleteObject(_Order_Detail);
    }

    public void DeleteOrderDetailByCurrentRecord(Order_Detail _Order_Detail)
    {
        DB.Order_Details.DeleteObject(_Order_Detail);
    }

    public void Commit()
    {
        DB.SaveChanges();
    }
}

Имя класса = Model \ OrderMasterReposity.cs

public class OrderMasterReposity : IOrderMasterRepository
{
    NorthwindEntities DB = new NorthwindEntities();

    public IQueryable<Order> GetOrderMasterByOrderID(int OrderID)
    {
        return DB.Orders.Where(tableX => tableX.OrderID == OrderID);   
    }

    public void InsertOrderMaster(Order _Order)
    {
        DB.Orders.AddObject(_Order);
    }

    public void UpdateOrderMaster(Order _Order)
    { 
        DB.ObjectStateManager.ChangeObjectState(_Order,  EntityState.Modified);
    }

    public void DeleteOrderMaster(int OrderID)
    { 
        Order _Order = DB.Orders.SingleOrDefault(x => x.OrderID == OrderID);

        if (_Order != null)
            DB.Orders.DeleteObject(_Order);            
    }

    public void Commit()
    {
        DB.SaveChanges();
    }
}

После всего кода верхнего уровня мне нужно вызвать эти два класса из моего класса контроллера.Итак, давайте предположим, что нижеприведенный код я напишу на уровне контроллера.

OrderMasterReposity _OrderMasterReposity = new OrderMasterReposity();
OrderDetailRepository _OrderDetailRepository = new OrderDetailRepository();
_OrderMasterReposity.InsertOrderMaster(new Order{....});
_OrderDetailRepository.InsertOrderDetail(new Order_Detail{....});
_OrderMasterReposity.Commit();
_OrderDetailRepository.Commit();

Моя проблема в том, как я сейчас работаю, не так профессионально.
Поскольку мне нужно вызывать функцию Commit более одного раза.
Итак, пожалуйста, кто-нибудь может дать мне более приятный способ кодирования на уровне модели?

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Лучше всего, чтобы вы правильно реализовали шаблон Repository
Более того, детали Order не имеют значения без порядка, поэтому в соответствии с DDD не следует определять отдельный репозиторий для order_detail.я бы сделал что-то вроде

Order _order = OrderMasterRepository.GetOrder(orderID);
_order.Property1 = value1;
_order.Property2 = value2;
_order.Property3 = value3;
foreach(var orderDetail in _order.OrderDetails)
{
   orderDetail.Property1 = avalue1;
   orderDetail.Property2 = avalue2;
   .
   .
} 
OrderMasterRepository.Commit();

. Вышеуказанные операторы сохранят данные как в порядке, так и в таблице orderDetail.

1 голос
/ 29 декабря 2011

Вы можете использовать Единицу работы, см. Этот пример:

http://iridescence.no/post/ASPNET-MVC-DataContext-and-The-Unit-of-Work-Pattern.aspx

...