private PersitedObjectContainer Get(string id)
        {
            PersitedObjectContainer result = null;

            Execute((con) =>
            {
                result = con.QueryFirstOrDefault <PersitedObjectContainer>($"select * from {_options.TableName} where id = '{id}'");
            });

            return(result);
        }
        private void Insert(TAggregate aggregateRoot)
        {
            var data       = _jsonParser.AsJson(aggregateRoot.Snapshot());
            var eventEntry = new PersitedObjectContainer(Guid.Parse(aggregateRoot.Identity), data, 1);

            Execute(con =>
            {
                using (var tran = con.BeginTransaction())
                {
                    con.Execute($"insert into {_options.TableName} (Id,Data,Version) values ('{eventEntry.Id}','{eventEntry.Data}',{eventEntry.Version})", transaction: tran);

                    HandleEventInsert(aggregateRoot, con, tran);
                    tran.Commit();
                }
            });
        }
        private void Update(TAggregate aggregateRoot)
        {
            var entry = Get(aggregateRoot.Identity);

            if (entry.Version != aggregateRoot.Version())
            {
                throw new Exception("concurency exception");
            }

            var data = _jsonParser.AsJson(aggregateRoot);

            var updatedEntry = new PersitedObjectContainer(Guid.Parse(aggregateRoot.Identity), data, entry.Version + 1);

            Execute(con =>
            {
                con.Execute($"update {_options.TableName} set data='{updatedEntry.Data}',version={updatedEntry.Version}");
            });
        }
        private void Insert(TAggregate aggregateRoot)
        {
            var data       = _jsonParser.AsJson(aggregateRoot);
            var eventEntry = new PersitedObjectContainer(Guid.Parse(aggregateRoot.Identity), data, 1);

            Execute(con =>
            {
                using (var tran = con.BeginTransaction())
                {
                    con.Execute($"insert into {_options.TableName} (Id,Data,Version) values ('{eventEntry.Id}','{eventEntry.Data}',{eventEntry.Version})", transaction: tran);

                    foreach (var evnt in aggregateRoot.UncommittedChanges())
                    {
                        //insert into events table in same transaction
                    }
                    tran.Commit();
                }
            });
        }
        private void Update(TAggregate aggregateRoot)
        {
            var entry = Get(aggregateRoot.Identity);

            if (entry.Version != aggregateRoot.Version())
            {
                throw new Exception("concurency exception");
            }

            var data = _jsonParser.AsJson(aggregateRoot.Snapshot());

            var updatedEntry = new PersitedObjectContainer(Guid.Parse(aggregateRoot.Identity), data, entry.Version + 1);

            Execute(con =>
            {
                using (var tran = con.BeginTransaction())
                {
                    con.Execute($"update {_options.TableName} set data='{updatedEntry.Data}',version={updatedEntry.Version}");
                    HandleEventInsert(aggregateRoot, con, tran);
                    tran.Commit();
                }
            });
        }