Summary Aggregate Entity to cater aggregate entity CRUD enhancement

Posted Feb 06 2007, 11:11 AM by Arif.Budimartoyo  

 

Mungkin teman2 sering mengalami ke-kurang-puasan dalam menggunakan Entity classes dan aggregate entity dengan CRUD sebagai method standard accessing ke database, khususnya di architecture ORM.
Ya. CRUD memang dimaksudkan untuk standard basic accessing ke database yg mana meliputi operasi Create-Retrieve-Update-Delete. Semua access data memang berasal dari ke-4 operasi standard itu.

Tetapi sekarang kita bermain dengan Relational Database, memanfaatkan single Entity saja tidak cukup dan mostly tidak akan cukup. Data kita hampir semuanya memiliki relation, seperti Order dan Customer, Order dan Product, etc.
Lalu, bagaimana cara kita mengambil relational data itu?

Lazy Load approach kebanyakan dipakai sebagai solusi. Untuk mengambil informasi "Order bulan ini", kita akan me-Load data Order - based on criteria bulan ini, lalu diikuti Load data Customer dan atau Product.
    OrderList orders = OrderRepository.GetOrderList(startDate, endDate);
kemudian mungkin akan anda lakukan load data Customer per Order pada waktu ItemDataBound atau iterasi.
    Order order = (Order)e.Item.DataItem;
    Customer cust = order.Customer;
Kemudian anda bisa dapetkan dan bind ke control info Customer nya.
Working!

Summary Aggregate Entity approach. Ini dimaksudkan untuk mengcover kebutuhan enhance dari sekedar CRUD untuk relational dan aggregate entities yang sudah ada. Dengan summary aggregation entities anda bisa create satu class untuk menggabungkan relational dr beberapa entity /tabel dan melakukan Load data cukup sekali saja. Katakan kita create class OrderSummary adalah 1st class summary aggregate entity. Kemudian kita create class OrderSummaryResult sebagai data containernya yang merupakan denormalized dari Order. Di sisi database kita create View untuk representasi relational data kita yg lebih dari sekedar query biasa. Di dalamnya kita bisa lakukan JOIN untuk data2 related yg diperlukan.
Lalu bisa juga create class-class OrderSpecification, OrderTemplate sebagai parameter criteria. Dan tentu class-class supporting yg lain.
    OrderSpecification orderSpec = new OrderSpecification(startDate, endDate);
    orderSpec.Status = OrderStatus.Delivered;
    OrderSummaryResultList results = OrderSummary.SearchOrder(orderSpec);
    dgOrderSummary.DataSource = results;


Efeknya adalah biasanya kita akan memanfaatkan ini untuk ReadOnly access. Biasanya Report, atau Rich Info Display, Summarization, etc. 
Untuk Modify data, kita bisa tetap memakai aggregate entity class Order dan its related entities.
Working with just only one database query...
And.. I think it's more elegance..

Di level Enterprise Architecture, approachment seperti ini bisa berupa Entity Aggregation Layer.
http://msdn2.microsoft.com/en-us/library/ms978573.aspx

Cheers

Share this post: | | | |
Filed under:


Comments

adityapurwa said:

I have same problem in the past, when I should display a DataGrid with many columns from many tables inside it, therefore, I manipulate the DataGrid in its ItemDataBound event.

And then, I do the same thing just like you did, created one more entity which act just like a view in database-it aggregates many tables.

It works faster when binded to DataGrid's DataSource, because I'm not used ItemDataBound again to manipulate the Column's content.

# December 24, 2007 8:25 AM