장점
Simple, Minimal Coding
고급 기능을 간단하게 코드로 작성할 수 있으며, 유지보수 비용 최소화를 위해 데이터 액세스가 모델에 있습니다.
Type-Safe Queries
.NET 오브젝트는 type safe한 방식으로 쿼리 조건으로 사용되며, SQL 검증을 위한 테스트용 API가 제공됩니다.
Flexible SQL Generation
SQL 생성은 포괄적인 모델 Attribute Set을 통해서 제어되며, 필요하다면 raw SQL을 작성할 수도 있습니다.
Loose Relationships
관계는 사전 정의되는 대신 코딩에서 정의되며, 특정 쿼리에 대해서만 유지됩니다.
Transaction-Oriented
쿼리, 업데이트 및 작업은 추적 가능하며, 트랜잭션 관리가 자동으로 적용됩니다.
Ultra-Fast Performance
ADO.NET은 오버헤드를 거의 발생시키지 않으며 쿼리, 업데이트 및 작업은 일괄적으로 실행됩니다.
Code Snippets
- Model
- Retrieve
- Delete
- Update
- Transaction
Generating complex SQL queries is controlled by intuitive attributes applied to the model.
namespace Appeon.SqlModelMapperDemo.Models { //Generates the underlying SQL query according to the attributes [Top(1000)] [SqlParameter("custId", typeof(int))] [SqlParameter("stratOrderDate", typeof(DateTime))] [SqlParameter("endOrderDate", typeof(DateTime))] [Table("SalesOrderHeader",Schema = "Sales")] [SqlWhere("(CustomerId = :custId) and (Orderdate Between :stratOrderDate and :endOrderDate)")] public class SalesOrder { [Key] [Identity] public int SalesOrderID { get; set; } [Required] public DateTime? OrderDate { get; set; } [Required] public byte? Status { get; set; } [Required] public bool? OnlineOrderFlag { get; set; } [SqlCompute("(isnull(N'SO'+CONVERT([nvarchar](23),[SalesOrderID]),N'*** ERROR ***'))")] public string SalesOrderNumber { get; set; } [Required] public int? CustomerID { get; set; } [SqlCompute("(isnull(([SubTotal]+[TaxAmt])+[Freight],(0)))")] public decimal? TotalDue { get; set; } public DateTime? ModifiedDate { get; set; } //Nests a model and applies various attributes [JsonIgnore] [SetValue("$SalesOrderID", "$SalesOrderID", SetValueStrategy.Always)] [ModelEmbedded(typeof(SalesOrderDetail), ParamValue = "$SalesOrderID", CascadeCreate =true, CascadeDelete = true)] public IList< salesorderdetail> OrderDetails { get; set; } } }
Retrieving data and loading it into the model only requires parameters – no unproductive query language is necessary.
//Retrieves multiple rows of data, loads it into the model, and then puts it into a list _context.SqlModelMapper.Load< salesorderquery>(startDate, endDate, customerId) .ToList(); //Retrieves a single row of data and loads it into the model _context.SqlModelMapper.LoadByKey< salesorder>(orderId) .FirstOrDefault();
Deleting data (including data of a master-detail) only requires a key or the model.
//Deletes data corresponding with the specified key – either a single row of data or if a nested model then the cascaded data _context.SqlModelMapper.TrackDeleteByKey< salesorder>(orderId) .SaveChanges() // Deletes data corresponding with the specified model – either a single row of data or if a nested model then the cascaded data _context.SqlModelMapper.TrackDelete(salesOrder) .SaveChanges()
Saving data is controlled by intuitive tracking functions, with granular control whether to save the entire master-detail relationship or portion thereof (by including/excluding the appropriate TrackDetails).
//Saves data with a master-detail-detail relationship _context.SqlModelMapper.TrackMaster(header) .TrackDetails(o => o.SalesReasons, reasons) .TrackDetails(o => o.Details, details); _context.SqlModelMapper.SaveChanges();
Managing transactions is made effortless by powerful implicit capability – comprehensive tracking functions (that go way beyond tracking just the model) determine what is included.
//Tracks various models, raw SQL, and actions _context.SqlModelMapper.TrackCreate(salesOrder) .Track((saveContext) => { //C# code block …… }) //The C# code block will be executed when SaveChanges is called .TrackUpdate(salesPerson) .TrackSqlCUD(rawSql) .SaveChanges() //Executes all tracked items in one transaction and automatically commits or rolls back
기능
Model
모델은 데이터베이스 테이블에 열을 매핑하며 관련 SQL을 포함하고 있습니다. 모델의 SQL은 개발자가 SQL을 제어할 수 있도록 해주는 다양한 Attribute를 기반으로 생성됩니다. 또한 모델은 모델 중첩을 통해 Master-Detail-Detail과 같은 복잡한 관계를 표현할 수 있습니다.
SQL 쿼리를 정의합니다
매핑된 테이블을 위한 SQL Insert/Update/Delete 연산을 정의합니다
SQLModelMapper
SQLModelMapper는 트랜잭션 지향적인 데이터 조작 Component입니다. 데이터베이스 CRUD 연산을 간소화할 수 있는 오브젝트와 메소드를 제공하며, 추적된 항목에 자동 트랜잭션 관리를 적용합니다. 추적된 항목들을 성능 향상을 위해 일괄적으로 실행할 수도 있습니다.
Query
쿼리를 실행하고 추가적인 처리를 위해 Result Set을 임시 오브젝트에 로드하거나 계산된 Result Set을 반환합니다.
Aggregate & Scalar Load
모델에 정의된 쿼리를 실행하고 집계나 스칼라 계산값을 Result Set과 함께 반환합니다.
Tracking
트랜잭션 관리를 위해 모델의 변경 사항, SQL 및 작업을 추적합니다.
Execute
모델, SQL 또는 작업에서 추적된 모든 데이터베이스 연산을 일괄적으로 데이터베이스에 제출해 실행하고 ModelMapper가 트랜잭션을 관리하도록 합니다.
SaveChanges
추적된 항목들(모델의 변경 사항, SQL 및 작업)을 실행하여 모든 변경 사항을 데이터베이스에 저장합니다. 추적된 항목들을 성능 향상을 위해 일괄적으로 실행할 수도 있습니다.
Async
비동기적인 방식으로 CRUD 연산을 수행합니다.