public int Save(ImportResult result, IEnumerable<Transaction> transactions) { using (var transaction = new TransactionScope()) { var model = result.Map<Models.ImportResult>(); var transactionRecords = new List<Models.Transaction>(); var transactionComponents = new List<Models.TransactionComponent>(); foreach (var item in transactions) { var record = item.Map<Models.Transaction>(); transactionRecords.Add(record); transactionComponents.AddRange(item.Credit.Select(amount => amount.Map(new Models.TransactionComponent {TransactionId = record.Id, EntryTypeName = EntryType.Credit.ToString() }))); transactionComponents.AddRange(item.Debit.Select(amount => amount.Map(new Models.TransactionComponent {TransactionId = record.Id, EntryTypeName = EntryType.Debit.ToString() }))); } _database.Execute( @"INSERT INTO [Transaction] (Id, Date, Amount, Reference, Description) VALUES (@id, @date, @amount, @reference, @description)", transactionRecords); _database.Execute( @"INSERT INTO [TransactionComponent] (TransactionId, AccountId, EntryTypeName, Amount, Annotation, AppliedByRuleId) VALUES (@transactionId, @accountId, @entryTypeName, @amount, ISNULL(@annotation, ''), @appliedByRuleId)", transactionComponents); var importId = _database.ExecuteScalar<int>( @"INSERT INTO ImportResult (Name, ImportTypeName, Date) OUTPUT inserted.id VALUES (@name, @importType, @date)", model); _database.Execute( @"INSERT INTO ImportedTransaction (Id, ImportId, Unclassified, Amount) VALUES (@id, @importId, @unclassified, @amount)", transactionRecords .MapAll<Models.ImportedTransaction>() .Select(t => new {t.Id, importId, t.Unclassified, t.Amount})); transaction.Complete(); return importId; } }