public async Task async_hit_returns_values()
        {
            StoreOptions(_ =>
            {
                _.Schema.For <Shop>().SoftDeleted().AddSubClass <CoffeeShop>();
            });

            var shop = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(shop);
                session.SaveChanges();

                session.Delete(shop);
                session.SaveChanges();
            }

            var metadata = await theStore.Advanced.MetadataForAsync(shop);

            metadata.ShouldNotBeNull();
            metadata.CurrentVersion.ShouldNotBe(Guid.Empty);
            metadata.LastModified.ShouldNotBe(default(DateTime));
            metadata.DotNetType.ShouldBe(typeof(CoffeeShop).FullName);
            metadata.DocumentType.ShouldBe("coffee_shop");
            metadata.Deleted.ShouldBeTrue();
            metadata.DeletedAt.ShouldNotBeNull();
        }
        public async Task can_update_with_optimistic_concurrency_95_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync();
            }

            using (var session = theStore.OpenSession())
            {
                var doc2 = await session.LoadAsync <CoffeeShop>(doc1.Id);

                doc2.Name = "Mozart's";

                session.Store(doc2);
                await session.SaveChangesAsync();
            }

            using (var session = theStore.QuerySession())
            {
                (await session.LoadAsync <CoffeeShop>(doc1.Id)).Name.ShouldBe("Mozart's");
            }
        }
        public void store_with_the_right_version()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            DocumentMetadata metadata;

            using (var session = theStore.QuerySession())
            {
                metadata = session.MetadataFor(doc1);
            }

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";
                session.Store(doc1, metadata.CurrentVersion);

                session.SaveChanges();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load <CoffeeShop>(doc1.Id).Name
                .ShouldBe("Mozart's");
            }
        }
        public void total_miss_returns_null()
        {
            var shop = new CoffeeShop();

            theStore.Advanced.MetadataFor(shop)
                .ShouldBeNull();
        }
        public void can_update_with_optimistic_concurrency_95()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.OpenSession())
            {
                var doc2 = session.Load<CoffeeShop>(doc1.Id);
                doc2.Name = "Mozart's";

                session.Store(doc2);
                session.SaveChanges();
            }

            using (var session = theStore.QuerySession())
            {
                session.Load<CoffeeShop>(doc1.Id).Name.ShouldBe("Mozart's");
            }


        }
示例#6
0
        public async Task can_update_and_delete_related_documents()
        {
            var emp1 = new CoffeeShopEmployee();
            var doc1 = new CoffeeShop();

            doc1.Employees.Add(emp1.Id);

            using (var session = theStore.OpenSession())
            {
                session.Store(emp1);
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.OpenSession(tracking: DocumentTracking.DirtyTracking))
            {
                var emp = session.Load <CoffeeShopEmployee>(emp1.Id);
                var doc = session.Load <CoffeeShop>(doc1.Id);

                doc.Employees.Remove(emp.Id);
                session.Delete(emp);

                await session.SaveChangesAsync().ConfigureAwait(false);
            }
        }
        public void update_multiple_docs_at_a_time_sad_path()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = session.Load <CoffeeShop>(doc1.Id);
                doc12.Name = "Mozart's";

                var doc22 = session.Load <CoffeeShop>(doc2.Id);
                doc22.Name = "Dominican Joe's";

                using (var other = theStore.DirtyTrackedSession())
                {
                    other.Load <CoffeeShop>(doc1.Id).Name = "Genuine Joe's";
                    other.Load <CoffeeShop>(doc2.Id).Name = "Cafe Medici";

                    other.SaveChanges();
                }

                var ex = Exception <AggregateException> .ShouldBeThrownBy(() =>
                {
                    session.SaveChanges();
                });

                ex.InnerExceptions.OfType <ConcurrencyException>().Count().ShouldBe(2);
            }
        }
        public async Task store_with_the_right_version_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync();
            }

            DocumentMetadata metadata;

            using (var session = theStore.QuerySession())
            {
                metadata = await session.MetadataForAsync(doc1);
            }

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";
                session.Store(doc1, metadata.CurrentVersion);

                await session.SaveChangesAsync();
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync <CoffeeShop>(doc1.Id)).Name
                .ShouldBe("Mozart's");
            }
        }
        public void can_update_and_delete_related_documents_synchronous()
        {
            var emp1 = new CoffeeShopEmployee();
            var doc1 = new CoffeeShop();

            doc1.Employees.Add(emp1.Id);

            using (var session = theStore.OpenSession())
            {
                session.Store(emp1);
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.OpenSession(tracking: DocumentTracking.DirtyTracking))
            {
                var emp = session.Load <CoffeeShopEmployee>(emp1.Id);
                var doc = session.Load <CoffeeShop>(doc1.Id);

                doc.Employees.Remove(emp.Id);
                session.Delete(emp);

                session.SaveChanges();
            }
        }
        public async Task update_multiple_docs_at_a_time_happy_path_async()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                await session.SaveChangesAsync();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = await session.LoadAsync <CoffeeShop>(doc1.Id);

                doc12.Name = "Mozart's";

                var doc22 = await session.LoadAsync <CoffeeShop>(doc2.Id);

                doc22.Name = "Dominican Joe's";

                await session.SaveChangesAsync();
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync <CoffeeShop>(doc1.Id)).Name.ShouldBe("Mozart's");
                (await query.LoadAsync <CoffeeShop>(doc2.Id)).Name.ShouldBe("Dominican Joe's");
            }
        }
        public void can_do_multiple_updates_in_a_row_standard()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc2 = session.Load <CoffeeShop>(doc1.Id);
                doc2.Name = "Mozart's";

                session.SaveChanges();

                doc2.Name = "Cafe Medici";

                session.SaveChanges();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load <CoffeeShop>(doc1.Id).Name.ShouldBe("Cafe Medici");
            }
        }
        public void update_multiple_docs_at_a_time_happy_path()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = session.Load <CoffeeShop>(doc1.Id);
                doc12.Name = "Mozart's";

                var doc22 = session.Load <CoffeeShop>(doc2.Id);
                doc22.Name = "Dominican Joe's";

                session.SaveChanges();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load <CoffeeShop>(doc1.Id).Name.ShouldBe("Mozart's");
                query.Load <CoffeeShop>(doc2.Id).Name.ShouldBe("Dominican Joe's");
            }
        }
        public void total_miss_returns_null()
        {
            var shop = new CoffeeShop();

            theStore.Advanced.MetadataFor(shop)
            .ShouldBeNull();
        }
示例#14
0
        public void total_miss_returns_null()
        {
            var shop = new CoffeeShop();

            theStore.Tenancy.Default.MetadataFor(shop)
            .ShouldBeNull();
        }
        public void total_miss_returns_null()
        {
            var shop = new CoffeeShop();

            theSession.MetadataFor(shop)
            .ShouldBeNull();
        }
示例#16
0
        public async Task store_with_the_right_version_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var metadata = theStore.Advanced.MetadataFor(doc1);

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";
                session.Store(doc1, metadata.CurrentVersion);

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name
                .ShouldBe("Mozart's");
            }
        }
        public async Task can_do_multiple_updates_in_a_row_standard_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc2 = await session.LoadAsync <CoffeeShop>(doc1.Id);

                doc2.Name = "Mozart's";

                await session.SaveChangesAsync();

                doc2.Name = "Cafe Medici";

                await session.SaveChangesAsync();
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync <CoffeeShop>(doc1.Id)).Name.ShouldBe("Cafe Medici");
            }
        }
        public void Bug_669_can_store_and_update_same_document_with_optimistic_concurrency_and_dirty_tracking()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession(tracking: DocumentTracking.DirtyTracking))
            {
                session.Store(doc1);
                doc1.Name = "New Name";
                session.SaveChanges();
            }
        }
        public void can_insert_with_optimistic_concurrency_95()
        {
            using (var session = theStore.OpenSession())
            {
                var coffeeShop = new CoffeeShop();
                session.Store(coffeeShop);
                session.SaveChanges();

                SpecificationExtensions.ShouldNotBeNull(session.Load <CoffeeShop>(coffeeShop.Id));
            }
        }
        public async Task can_insert_with_optimistic_concurrency_95_async()
        {
            using (var session = theStore.OpenSession())
            {
                var coffeeShop = new CoffeeShop();
                session.Store(coffeeShop);
                await session.SaveChangesAsync();

                SpecificationExtensions.ShouldNotBeNull((await session.LoadAsync <CoffeeShop>(coffeeShop.Id)));
            }
        }
        public async Task can_insert_with_optimistic_concurrency_95_async()
        {
            using (var session = theStore.OpenSession())
            {
                var coffeeShop = new CoffeeShop();
                session.Store(coffeeShop);
                await session.SaveChangesAsync().ConfigureAwait(false);

                (await session.LoadAsync<CoffeeShop>(coffeeShop.Id).ConfigureAwait(false)).ShouldNotBeNull();
            }
        }
        public void can_insert_with_optimistic_concurrency_95()
        {
            using (var session = theStore.OpenSession())
            {
                var coffeeShop = new CoffeeShop();
                session.Store(coffeeShop);
                session.SaveChanges();

                session.Load<CoffeeShop>(coffeeShop.Id).ShouldNotBeNull();
            }
        }
        public async Task can_insert_with_optimistic_concurrency_94_async()
        {
            using (var session = theStore.OpenSession())
            {
                var coffeeShop = new CoffeeShop();
                session.Store(coffeeShop);
                await session.SaveChangesAsync().ConfigureAwait(false);

                (await session.LoadAsync <CoffeeShop>(coffeeShop.Id).ConfigureAwait(false)).ShouldNotBeNull();
            }
        }
        public void can_store_same_document_multiple_times_with_optimistic_concurrency()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.Store(doc1);

                session.SaveChanges();
            }
        }
    public void hit_returns_values()
    {
        var shop = new CoffeeShop();

        using (var session = theStore.OpenSession())
        {
            session.Store(shop);
            session.SaveChanges();
        }

        var metadata = theStore.Advanced.MetadataFor(shop);

        metadata.ShouldNotBeNull();
        metadata.CurrentVersion.ShouldNotBe(Guid.Empty);
        metadata.LastModified.ShouldNotBe(default(DateTime));
    }
示例#26
0
        public void hit_returns_values()
        {
            var shop = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(shop);
                session.SaveChanges();
            }

            var metadata = theStore.Advanced.MetadataFor(shop);

            metadata.ShouldNotBeNull();
            metadata.CurrentVersion.ShouldNotBe(Guid.Empty);
            metadata.LastModified.ShouldNotBe(default(DateTime));
        }
示例#27
0
        public async Task update_with_stale_version_standard_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var session1 = theStore.DirtyTrackedSession();
            var session2 = theStore.DirtyTrackedSession();

            var session1Copy = await session1.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false);

            var session2Copy = await session2.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false);

            try
            {
                session1Copy.Name = "Mozart's";
                session2Copy.Name = "Dominican Joe's";

                // Should go through just fine
                await session2.SaveChangesAsync().ConfigureAwait(false);


                var ex = await Exception <AggregateException> .ShouldBeThrownByAsync(async() =>
                {
                    await session1.SaveChangesAsync().ConfigureAwait(false);
                });

                var concurrency = ex.InnerExceptions.OfType <ConcurrencyException>().Single();
                concurrency.Message.ShouldBe($"Optimistic concurrency check failed for {typeof(CoffeeShop).FullName} #{doc1.Id}");
            }
            finally
            {
                session1.Dispose();
                session2.Dispose();
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name.ShouldBe("Dominican Joe's");
            }
        }
示例#28
0
        public void overwrite_with_stale_version_standard()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }
            // SAMPLE: sample-override-optimistic-concurrency
            var session1 = theStore.OpenSession(new SessionOptions
            {
                ConcurrencyChecks = ConcurrencyChecks.Disabled,
                Tracking          = DocumentTracking.DirtyTracking
            });
            // ENDSAMPLE

            var session2 = theStore.DirtyTrackedSession();

            var session1Copy = session1.Load <CoffeeShop>(doc1.Id);
            var session2Copy = session2.Load <CoffeeShop>(doc1.Id);

            try
            {
                session1Copy.Name = "Mozart's";
                session2Copy.Name = "Dominican Joe's";

                // Should go through just fine
                session2.SaveChanges();


                session1.SaveChanges();
            }
            finally
            {
                session1.Dispose();
                session2.Dispose();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load <CoffeeShop>(doc1.Id).Name.ShouldBe("Mozart's");
            }
        }
        public void update_with_stale_version()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            var session1 = theStore.DirtyTrackedSession();
            var session2 = theStore.DirtyTrackedSession();

            var session1Copy = session1.Load <CoffeeShop>(doc1.Id);
            var session2Copy = session2.Load <CoffeeShop>(doc1.Id);

            try
            {
                session1Copy.Name = "Mozart's";
                session2Copy.Name = "Dominican Joe's";

                // Should go through just fine
                session2.SaveChanges();


                var ex = Exception <AggregateException> .ShouldBeThrownBy(() =>
                {
                    session1.SaveChanges();
                });

                var concurrency = ex.InnerExceptions.OfType <ConcurrencyException>().Single();
                concurrency.Message.ShouldBe($"Optimistic concurrency check failed for {typeof(Shop).FullName} #{doc1.Id}");
            }
            finally
            {
                session1.Dispose();
                session2.Dispose();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load <CoffeeShop>(doc1.Id).Name.ShouldBe("Dominican Joe's");
            }
        }
        public void hit_returns_values()
        {
            var shop = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(shop);
                session.SaveChanges();
            }

            var metadata = theStore.Advanced.MetadataFor(shop);

            metadata.ShouldNotBeNull();
            metadata.CurrentVersion.ShouldNotBe(Guid.Empty);
            metadata.LastModified.ShouldNotBe(default(DateTime));
            metadata.DotNetType.ShouldBe(typeof(CoffeeShop).FullName);
            metadata.DocumentType.ShouldBeNull();
            metadata.Deleted.ShouldBeFalse();
            metadata.DeletedAt.ShouldBeNull();
        }
示例#31
0
        public async Task update_multiple_docs_at_a_time_sad_path_async()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = await session.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false);

                doc12.Name = "Mozart's";

                var doc22 = await session.LoadAsync <CoffeeShop>(doc2.Id).ConfigureAwait(false);

                doc22.Name = "Dominican Joe's";


                using (var other = theStore.DirtyTrackedSession())
                {
                    (await other.LoadAsync <CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name = "Genuine Joe's";
                    (await other.LoadAsync <CoffeeShop>(doc2.Id).ConfigureAwait(false)).Name = "Cafe Medici";

                    await other.SaveChangesAsync().ConfigureAwait(false);
                }

                var ex = await Exception <AggregateException> .ShouldBeThrownByAsync(async() =>
                {
                    await session.SaveChangesAsync().ConfigureAwait(false);
                });

                ex.InnerExceptions.OfType <ConcurrencyException>().Count().ShouldBe(2);
            }
        }
示例#32
0
        public void store_with_the_right_version_sad_path()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";

                // Some random version that won't match
                session.Store(doc1, Guid.NewGuid());

                Exception <AggregateException> .ShouldBeThrownBy(() =>
                {
                    session.SaveChanges();
                });
            }
        }
        public async Task can_update_with_optimistic_concurrenc_async()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.OpenSession())
            {
                var doc2 = await session.LoadAsync<Shop>(doc1.Id).ConfigureAwait(false);
                doc2.As<CoffeeShop>().Name = "Mozart's";

                session.Store(doc2);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.QuerySession())
            {
                (await session.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name.ShouldBe("Mozart's");
            }
        }
        public async Task store_with_the_right_version_sad_path_async()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync();
            }

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";

                // Some random version that won't match
                session.Store(doc1, Guid.NewGuid());

                await Exception <ConcurrencyException> .ShouldBeThrownByAsync(async() =>
                {
                    await session.SaveChangesAsync();
                });
            }
        }
        public void can_update_with_optimistic_concurrency_95()
        {
            var doc1 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.OpenSession())
            {
                var doc2 = session.Load <CoffeeShop>(doc1.Id);
                doc2.Name = "Mozart's";

                session.Store(doc2);
                session.SaveChanges();
            }

            using (var session = theStore.QuerySession())
            {
                session.Load <CoffeeShop>(doc1.Id).Name.ShouldBe("Mozart's");
            }
        }
示例#36
0
        public void total_miss_returns_null()
        {
            var shop = new CoffeeShop();

            SpecificationExtensions.ShouldBeNull(theStore.Tenancy.Default.MetadataFor(shop));
        }
        public void update_multiple_docs_at_a_time_sad_path()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = session.Load<CoffeeShop>(doc1.Id);
                doc12.Name = "Mozart's";

                var doc22 = session.Load<CoffeeShop>(doc2.Id);
                doc22.Name = "Dominican Joe's";


                using (var other = theStore.DirtyTrackedSession())
                {
                    other.Load<CoffeeShop>(doc1.Id).Name = "Genuine Joe's";
                    other.Load<CoffeeShop>(doc2.Id).Name = "Cafe Medici";

                    other.SaveChanges();
                }

                var ex = Exception<AggregateException>.ShouldBeThrownBy(() =>
                {
                    session.SaveChanges();
                });

                ex.InnerExceptions.OfType<ConcurrencyException>().Count().ShouldBe(2);
            }
        }
        public async Task update_with_stale_version_standard_async()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var session1 = theStore.DirtyTrackedSession();
            var session2 = theStore.DirtyTrackedSession();

            var session1Copy = await session1.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false);
            var session2Copy = await session2.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false);

            try
            {
                session1Copy.Name = "Mozart's";
                session2Copy.Name = "Dominican Joe's";

                // Should go through just fine
                await session2.SaveChangesAsync().ConfigureAwait(false);


                var ex = await Exception<AggregateException>.ShouldBeThrownByAsync(async () =>
                {
                    await session1.SaveChangesAsync().ConfigureAwait(false);
                });

                var concurrency = ex.InnerExceptions.OfType<ConcurrencyException>().Single();
                concurrency.Message.ShouldBe($"Optimistic concurrency check failed for {typeof(CoffeeShop).FullName} #{doc1.Id}");
            }
            finally
            {
                session1.Dispose();
                session2.Dispose();
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name.ShouldBe("Dominican Joe's");
            }

        }
        public void update_with_stale_version()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            var session1 = theStore.DirtyTrackedSession();
            var session2 = theStore.DirtyTrackedSession();

            var session1Copy = session1.Load<CoffeeShop>(doc1.Id);
            var session2Copy = session2.Load<CoffeeShop>(doc1.Id);

            try
            {
                session1Copy.Name = "Mozart's";
                session2Copy.Name = "Dominican Joe's";

                // Should go through just fine
                session2.SaveChanges();


                var ex = Exception<AggregateException>.ShouldBeThrownBy(() =>
                {
                    session1.SaveChanges();
                });

                var concurrency = ex.InnerExceptions.OfType<ConcurrencyException>().Single();
                concurrency.Message.ShouldBe($"Optimistic concurrency check failed for {typeof(Shop).FullName} #{doc1.Id}");
            }
            finally
            {
                session1.Dispose();
                session2.Dispose();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load<CoffeeShop>(doc1.Id).Name.ShouldBe("Dominican Joe's");
            }

        }
        public async Task can_do_multiple_updates_in_a_row_standard_async()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc2 = await session.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false);
                doc2.Name = "Mozart's";

                await session.SaveChangesAsync().ConfigureAwait(false);

                doc2.Name = "Cafe Medici";

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name.ShouldBe("Cafe Medici");
            }
        }
        public void can_do_multiple_updates_in_a_row_standard()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc2 = session.Load<CoffeeShop>(doc1.Id);
                doc2.Name = "Mozart's";

                session.SaveChanges();

                doc2.Name = "Cafe Medici";

                session.SaveChanges();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load<CoffeeShop>(doc1.Id).Name.ShouldBe("Cafe Medici");
            }
        }
        public async Task update_multiple_docs_at_a_time_happy_path_async()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = await session.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false);
                doc12.Name = "Mozart's";

                var doc22 = await session.LoadAsync<CoffeeShop>(doc2.Id).ConfigureAwait(false);
                doc22.Name = "Dominican Joe's";

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name.ShouldBe("Mozart's");
                (await query.LoadAsync<CoffeeShop>(doc2.Id).ConfigureAwait(false)).Name.ShouldBe("Dominican Joe's");
            }
        }
        public void update_multiple_docs_at_a_time_happy_path()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                session.SaveChanges();
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = session.Load<CoffeeShop>(doc1.Id);
                doc12.Name = "Mozart's";

                var doc22 = session.Load<CoffeeShop>(doc2.Id);
                doc22.Name = "Dominican Joe's";

                session.SaveChanges();
            }

            using (var query = theStore.QuerySession())
            {
                query.Load<CoffeeShop>(doc1.Id).Name.ShouldBe("Mozart's");
                query.Load<CoffeeShop>(doc2.Id).Name.ShouldBe("Dominican Joe's");
            }
        }
        public async Task update_multiple_docs_at_a_time_sad_path_async()
        {
            var doc1 = new CoffeeShop();
            var doc2 = new CoffeeShop();

            using (var session = theStore.OpenSession())
            {
                session.Store(doc1, doc2);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var session = theStore.DirtyTrackedSession())
            {
                var doc12 = await session.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false);
                doc12.Name = "Mozart's";

                var doc22 = await session.LoadAsync<CoffeeShop>(doc2.Id).ConfigureAwait(false);
                doc22.Name = "Dominican Joe's";


                using (var other = theStore.DirtyTrackedSession())
                {
                    (await other.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name = "Genuine Joe's";
                    (await other.LoadAsync<CoffeeShop>(doc2.Id).ConfigureAwait(false)).Name = "Cafe Medici";

                    await other.SaveChangesAsync().ConfigureAwait(false);
                }

                var ex = await Exception<AggregateException>.ShouldBeThrownByAsync(async () =>
                {
                    await session.SaveChangesAsync().ConfigureAwait(false);
                });

                ex.InnerExceptions.OfType<ConcurrencyException>().Count().ShouldBe(2);
            }
        }
    public void store_with_the_right_version()
    {
        var doc1 = new CoffeeShop();
        using (var session = theStore.OpenSession())
        {
            session.Store(doc1);
            session.SaveChanges();
        }

        var metadata = theStore.Advanced.MetadataFor(doc1);

        using (var session = theStore.OpenSession())
        {
            doc1.Name = "Mozart's";
            session.Store(doc1, metadata.CurrentVersion);

            session.SaveChanges();
        }

        using (var query = theStore.QuerySession())
        {
            query.Load<CoffeeShop>(doc1.Id).Name
                .ShouldBe("Mozart's");
        }
    }
        public async Task store_with_the_right_version_async()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var metadata = theStore.Advanced.MetadataFor(doc1);

            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";
                session.Store(doc1, metadata.CurrentVersion);

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            using (var query = theStore.QuerySession())
            {
                (await query.LoadAsync<CoffeeShop>(doc1.Id).ConfigureAwait(false)).Name
                    .ShouldBe("Mozart's");
            }
        }
        public void store_with_the_right_version_sad_path()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                session.SaveChanges();
            }


            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";

                // Some random version that won't match
                session.Store(doc1, Guid.NewGuid());

                Exception<AggregateException>.ShouldBeThrownBy(() =>
                {
                    session.SaveChanges();
                });
            }


        }
        public async Task store_with_the_right_version_sad_path_async()
        {
            var doc1 = new CoffeeShop();
            using (var session = theStore.OpenSession())
            {
                session.Store(doc1);
                await session.SaveChangesAsync().ConfigureAwait(false);
            }


            using (var session = theStore.OpenSession())
            {
                doc1.Name = "Mozart's";

                // Some random version that won't match
                session.Store(doc1, Guid.NewGuid());

                await Exception<AggregateException>.ShouldBeThrownByAsync(async () =>
                {
                    await session.SaveChangesAsync().ConfigureAwait(false);
                });
            }


        }