public async Task DynamicReferenceTest()
        {
            var domain = await LoadDynamicDomain();

            dynamic lib  = null;
            dynamic loan = null;

            using (var session = domain.Store.BeginSession())
            {
                lib      = new DynamicModelEntity(domain, "Library");
                lib.Name = "Library";

                var book = new DynamicModelEntity(domain, "Book");
                lib.Books.Add(book);

                loan      = new DynamicModelEntity(domain, "Loan");
                loan.Book = book;

                session.AcceptChanges();
            }

            Assert.NotNull(lib);
            Assert.NotNull(loan.Book);
            Assert.NotNull(((IEnumerable <IModelElement>)lib.Books).FirstOrDefault());
        }
예제 #2
0
        public async Task AddInTransaction()
        {
            var store = await StoreBuilder.New().CreateAsync();

            var schema = await store.Schemas.New <TestDomainDefinition>().CreateAsync();

            var domain = await store.DomainModels.New().CreateAsync("Test");

            domain.Indexes.CreateIndex(schema.Definition.XExtendsBaseClass, "index1", true, "Name");
            var index = domain.Indexes.GetIndex("index1");

            using (var s = domain.Store.BeginSession())
            {
                dynamic a = new DynamicModelEntity(domain, schema.Definition.XExtendsBaseClass);
                a.Name = "momo";
                s.AcceptChanges();
                // Est visible dans la transaction
                Assert.NotNull(domain.GetElement(index.Get("momo")));
            }

            using (var session = domain.Store.BeginSession(new SessionConfiguration {
                Readonly = true
            }))
            {
                Assert.NotNull(domain.GetElement(index.Get("momo")));
            }
        }
        internal DynamicPropertyDescriptor(DynamicModelEntity owner, ISchemaProperty property)
            : base(property.Name, null)
        {
            DebugContract.Requires(owner);
            DebugContract.Requires(property);

            _element  = owner;
            _property = property;
        }
        public async Task SerializableTransactionTest()
        {
            var store = await StoreBuilder.New().CreateAsync();

            var schema = await store.Schemas.New <TestDomainDefinition>().CreateAsync();

            var domain = await store.DomainModels.New().CreateAsync("Test");

            Identity aid;
            dynamic  a;

            using (var s = store.BeginSession(new SessionConfiguration {
                IsolationLevel = SessionIsolationLevel.ReadCommitted
            }))
            {
                a       = new DynamicModelEntity(domain, schema.Definition.XExtendsBaseClass);
                aid     = a.Id;
                a.Value = 10;
                s.AcceptChanges();
            }

            var factory = new TaskFactory();
            var signal  = new System.Threading.ManualResetEventSlim();
            var signal2 = new System.Threading.ManualResetEventSlim();

            var t1 = factory.StartNew(() =>
            {
                using (var s = store.BeginSession(new SessionConfiguration {
                    IsolationLevel = SessionIsolationLevel.Serializable
                }))
                {
                    // Accès sur A pour ouvrir une transaction Serializable (la session ne fait rien). Ce n'est que qu'en on
                    // accède à la donnée que la transaction est crèèe
                    var x = a.Value; // Ou n'importe quoi
                    signal2.Set();
                    signal.Wait();
                    Assert.Equal(a.Value, 10); // On ne "voit" pas les modifications des autres transactions
                }
            });

            Sleep(50);

            var t2 = factory.StartNew(() =>
            {
                signal2.Wait();
                using (var s = store.BeginSession(new SessionConfiguration {
                    IsolationLevel = SessionIsolationLevel.ReadCommitted
                }))
                {
                    a.Value = 11;
                    s.AcceptChanges();
                }
                signal.Set();
            });

            Task.WaitAll(t1, t2);
        }
        public async Task ReadPhantomTest()
        {
            var store = await StoreBuilder.New().CreateAsync();

            var schema = await store.Schemas.New <TestDomainDefinition>().CreateAsync();

            var domain = await store.DomainModels.New().CreateAsync("Test");

            Identity aid;
            dynamic  a;

            // Création d'une valeur
            using (var s = store.BeginSession(new SessionConfiguration {
                IsolationLevel = SessionIsolationLevel.ReadCommitted
            }))
            {
                a       = new DynamicModelEntity(domain, schema.Definition.XExtendsBaseClass);
                aid     = a.Id;
                a.Value = 10;
                s.AcceptChanges();
            }

            var factory = new TaskFactory();
            var signal  = new System.Threading.ManualResetEventSlim();
            var signal2 = new System.Threading.ManualResetEventSlim();

            var t1 = factory.StartNew(() =>
            {
                // Cette transaction démarre avant l'autre mais elle va pouvoir 'voir' ses modifs commités
                using (var s = store.BeginSession(new SessionConfiguration {
                    IsolationLevel = SessionIsolationLevel.ReadCommitted
                }))
                {
                    signal2.Set();
                    signal.Wait();             // On attend le commit de l'autre
                    Assert.Equal(11, a.Value); // On "voit" dèja que la valeur a été modifiée
                }
            });

            Sleep(50);

            var t2 = factory.StartNew(() =>
            {
                signal2.Wait(); // On s'assure de démarrer aprés l'autre transaction
                using (var s = store.BeginSession(new SessionConfiguration {
                    IsolationLevel = SessionIsolationLevel.ReadCommitted
                }))
                {
                    a.Value = 11;
                    s.AcceptChanges();
                }
                signal.Set();
            });

            Task.WaitAll(t1, t2);
        }
        public async Task CreateDynamicElementTest()
        {
            var domain = await LoadDynamicDomain();

            dynamic x = null;

            using (var session = domain.Store.BeginSession())
            {
                x = new DynamicModelEntity(domain, "Library");
                session.AcceptChanges();
            }

            Assert.NotNull(x);
        }
        public async Task DynamicPropertyTest()
        {
            var domain = await LoadDynamicDomain();

            dynamic x = null;

            using (var session = domain.Store.BeginSession())
            {
                x      = new DynamicModelEntity(domain, "Library");
                x.Name = "Library";
                session.AcceptChanges();
            }

            Assert.NotNull(x);
            Assert.Equal("Library", x.Name);
        }
예제 #8
0
        public async Task IndexTest()
        {
            var store = await StoreBuilder.New().CreateAsync();

            var schema = await store.Schemas.New <TestDomainDefinition>().CreateAsync();

            var domain = await store.DomainModels.New().CreateAsync("Test");

            domain.Indexes.CreateIndex(schema.Definition.XExtendsBaseClass, "index1", true, "Name");

            using (var tx = domain.Store.BeginSession())
            {
                dynamic a = new DynamicModelEntity(domain, schema.Definition.XExtendsBaseClass);
                a.Name = "toto";
                tx.AcceptChanges();
            }
        }
예제 #9
0
        public async Task RemoveIndexElement()
        {
            var store = await StoreBuilder.New().CreateAsync();

            var schema = await store.Schemas.New <TestDomainDefinition>().CreateAsync();

            var domain = await store.DomainModels.New().CreateAsync("Test");

            domain.Indexes.CreateIndex(schema.Definition.XExtendsBaseClass, "index1", true, "Name");
            domain.Indexes.CreateIndex(schema.Definition.XExtendsBaseClass, "index2", true, "Value");
            var index1 = domain.Indexes.GetIndex("index1");
            var index2 = domain.Indexes.GetIndex("index2");

            using (var s = domain.Store.BeginSession())
            {
                dynamic a = new DynamicModelEntity(domain, schema.Definition.XExtendsBaseClass);
                a.Name  = "momo";
                a.Value = 10;
                s.AcceptChanges();
            }

            dynamic mel = domain.GetElement(index1.Get("momo"));

            Assert.NotNull(mel);

            mel = domain.GetElement(index2.Get(10));
            Assert.NotNull(mel);

            using (var s = domain.Store.BeginSession())
            {
                s.Execute(new RemoveEntityCommand(mel));
                s.AcceptChanges();

                // Ne doit plus être visible ds la transaction
                Assert.Null(domain.GetElement(index1.Get("momo")));
                Assert.Null(domain.GetElement(index2.Get(10)));
            }

            using (var session = domain.Store.BeginSession(new SessionConfiguration {
                Readonly = true
            }))
            {
                Assert.Null(domain.GetElement(index1.Get("momo")));
                Assert.Null(domain.GetElement(index2.Get(10)));
            }
        }
 internal DynamicTypeDescriptor(DynamicModelEntity element)
 {
     DebugContract.Requires(element);
     _element = element;
 }