Пример #1
0
        public void DataContainerMapRegistering_IgnoresNonNewObjects()
        {
            var middleTransaction = CreateSubTransactionAndClearListeners(_rootTransaction);
            var subTransaction    = CreateSubTransactionAndClearListeners(middleTransaction);

            var dataContainer = DataContainer.CreateForExisting(DomainObjectIDs.Order1, null, pd => pd.DefaultValue);
            var domainObject  = LifetimeService.GetObjectReference(subTransaction, dataContainer.ID);

            dataContainer.SetDomainObject(domainObject);

            _listener.DataContainerMapRegistering(subTransaction, dataContainer);

            Assert.That(_rootTransaction.IsInvalid(DomainObjectIDs.Order1), Is.False);
            Assert.That(middleTransaction.IsInvalid(DomainObjectIDs.Order1), Is.False);
            Assert.That(subTransaction.IsInvalid(DomainObjectIDs.Order1), Is.False);
        }
Пример #2
0
        public void CanWrite_DeletedObject_ReturnsFalse()
        {
            var instance = SampleBindableDomainObject.NewObject();
            var property = GetProperty(instance);
            var strategy = (IBindablePropertyWriteAccessStrategy) new BindableDomainObjectPropertyWriteAccessStrategy();

            using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
            {
                LifetimeService.DeleteObject(instance.DefaultTransactionContext.ClientTransaction, instance);
                Assert.That(instance.State, Is.EqualTo(StateType.Deleted));

                var result = strategy.CanWrite(instance, property);

                Assert.That(result, Is.False);
            }
        }
        public void PropertyAccess_Subtransaction()
        {
            using (TestableClientTransaction.CreateSubTransaction().EnterDiscardingScope())
            {
                var instance = (ClassWithAllDataTypes)LifetimeService.GetObjectReference(ClientTransaction.Current, _nonExistingObjectIDForSubtransaction);
                CheckObjectIsMarkedInvalid(_nonExistingObjectIDForSubtransaction);

                Assert.That(() => instance.StringProperty, ThrowsObjectInvalidException(_nonExistingObjectIDForSubtransaction));

                var instance2 = (Order)LifetimeService.GetObjectReference(ClientTransaction.Current, _nonExistingObjectID);
                Assert.That(() => instance2.OrderNumber, ThrowsObjectNotFoundException(_nonExistingObjectID));
                CheckObjectIsMarkedInvalid(_nonExistingObjectID);
            }
            CheckObjectIsMarkedInvalid(_nonExistingObjectID);
            CheckObjectIsNotMarkedInvalid(_nonExistingObjectIDForSubtransaction);
        }
Пример #4
0
        public void CanWrite_NotLoadedObject_LoadsNonExistentObject_ReturnsFalse()
        {
            var instance = (SampleBindableDomainObject)LifetimeService.GetObjectReference(
                ClientTransaction.Current,
                new ObjectID(typeof(SampleBindableDomainObject), Guid.NewGuid()));

            var property = GetProperty(instance);
            var strategy = (IBindablePropertyWriteAccessStrategy) new BindableDomainObjectPropertyWriteAccessStrategy();

            Assert.That(instance.State, Is.EqualTo(StateType.NotLoadedYet));

            var result = strategy.CanWrite(instance, property);

            Assert.That(result, Is.False);
            Assert.That(instance.State, Is.EqualTo(StateType.Invalid));
        }
        public override void SetUp()
        {
            base.SetUp();

            _loadedOrder1       = DomainObjectIDs.Order1.GetObject <Order> ();
            _notYetLoadedOrder2 = (Order)LifetimeService.GetObjectReference(TestableClientTransaction, DomainObjectIDs.Order3);
            _newOrder           = Order.NewObject();

            _loadedOrder1Context       = new DomainObjectTransactionContext(_loadedOrder1, TestableClientTransaction);
            _notYetLoadedOrder2Context = new DomainObjectTransactionContext(_notYetLoadedOrder2, TestableClientTransaction);
            _newOrderContext           = new DomainObjectTransactionContext(_newOrder, TestableClientTransaction);

            var objectBeingInitialized = Order.NewObject();

            PrivateInvoke.SetNonPublicField(objectBeingInitialized, "_isReferenceInitializeEventExecuting", true);
            _referenceInitializationContext = new DomainObjectTransactionContext(objectBeingInitialized, TestableClientTransaction);
        }
 public static ObjectEndPoint CreateObjectEndPoint(RelationEndPointID endPointID, ObjectID oppositeObjectID)
 {
     if (endPointID.Definition.IsVirtual)
     {
         var clientTransaction          = ClientTransaction.Current;
         VirtualObjectEndPoint endPoint = CreateVirtualObjectEndPoint(endPointID, clientTransaction);
         endPoint.MarkDataComplete(LifetimeService.GetObjectReference(clientTransaction, oppositeObjectID));
         return(endPoint);
     }
     else
     {
         var endPoint = CreateRealObjectEndPoint(endPointID);
         RealObjectEndPointTestHelper.SetValueViaDataContainer(endPoint, oppositeObjectID);
         endPoint.Commit();
         return(endPoint);
     }
 }
Пример #7
0
        public void Get_StateCombinationsFromDatabase()
        {
            DatabaseFixtures dbFixtures   = new DatabaseFixtures();
            var expectedAcl               = dbFixtures.CreateAndCommitAccessControlListWithStateCombinations(10, ClientTransactionScope.CurrentTransaction);
            var expectedStateCombinations = expectedAcl.StateCombinations;

            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                var actualAcl = (StatefulAccessControlList)LifetimeService.GetObject(ClientTransaction.Current, expectedAcl.ID, false);

                Assert.That(actualAcl.StateCombinations.Count, Is.EqualTo(9));
                for (int i = 0; i < 9; i++)
                {
                    Assert.That(actualAcl.StateCombinations[i].ID, Is.EqualTo(expectedStateCombinations[i].ID));
                }
            }
        }
        public void EnsureDataAvailable_Subtransaction()
        {
            using (TestableClientTransaction.CreateSubTransaction().EnterDiscardingScope())
            {
                var instance = LifetimeService.GetObjectReference(ClientTransaction.Current, _nonExistingObjectIDForSubtransaction);
                CheckObjectIsMarkedInvalid(instance.ID);

                Assert.That(() => instance.EnsureDataAvailable(), ThrowsObjectInvalidException(_nonExistingObjectIDForSubtransaction));

                var instance2 = LifetimeService.GetObjectReference(ClientTransaction.Current, _nonExistingObjectID);
                Assert.That(() => instance2.EnsureDataAvailable(), ThrowsObjectNotFoundException(_nonExistingObjectID));
                CheckObjectIsMarkedInvalid(_nonExistingObjectID);
            }

            CheckObjectIsMarkedInvalid(_nonExistingObjectID);
            CheckObjectIsNotMarkedInvalid(_nonExistingObjectIDForSubtransaction);
        }
        public void MultiplePropertiesWithSameShortName()
        {
            var derivedClass = (DerivedClassWithDifferentProperties)LifetimeService.NewObject(TestableClientTransaction, typeof(DerivedClassWithDifferentProperties), ParamList.Empty);
            ClassWithDifferentProperties baseClass = derivedClass;

            derivedClass.String = "Derived";
            baseClass.String    = "Base";

            Assert.That(derivedClass.String, Is.EqualTo("Derived"));
            Assert.That(baseClass.String, Is.EqualTo("Base"));

            baseClass.String    = "NewBase";
            derivedClass.String = "NewDerived";

            Assert.That(derivedClass.String, Is.EqualTo("NewDerived"));
            Assert.That(baseClass.String, Is.EqualTo("NewBase"));
        }
Пример #10
0
        public void Get_AccessControlEntriesFromDatabase()
        {
            DatabaseFixtures  dbFixtures  = new DatabaseFixtures();
            AccessControlList expectedAcl =
                dbFixtures.CreateAndCommitAccessControlListWithAccessControlEntries(10, ClientTransactionScope.CurrentTransaction);
            ObjectList <AccessControlEntry> expectedAces = expectedAcl.AccessControlEntries;

            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                var actualAcl = (AccessControlList)LifetimeService.GetObject(ClientTransaction.Current, expectedAcl.ID, false);

                Assert.That(actualAcl.AccessControlEntries.Count, Is.EqualTo(10));
                for (int i = 0; i < 10; i++)
                {
                    Assert.That(actualAcl.AccessControlEntries[i].ID, Is.EqualTo(expectedAces[i].ID));
                }
            }
        }
        public void GetObject_Twice()
        {
            DomainObject domainObject1 = LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.ClassWithAllDataTypes1, false);

            Assert.That(_eventReceiver.LoadedDomainObjectLists.Count, Is.EqualTo(1));

            var domainObjects = _eventReceiver.LoadedDomainObjectLists[0];

            Assert.That(domainObjects.Count, Is.EqualTo(1));
            Assert.That(domainObjects[0], Is.SameAs(domainObject1));
            _eventReceiver.Clear();

            DomainObject domainObject2 = LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.ClassWithAllDataTypes1, false);

            Assert.That(_eventReceiver.LoadedDomainObjectLists.Count, Is.EqualTo(0));

            Assert.That(domainObject2, Is.SameAs(domainObject1));
        }
Пример #12
0
        public void OnDomainObjectCreated()
        {
            var mixinInstance = new HookedDomainObjectMixin();

            Assert.That(mixinInstance.OnLoadedCalled, Is.False);
            Assert.That(mixinInstance.OnCreatedCalled, Is.False);
            Assert.That(mixinInstance.OnDomainObjectReferenceInitializingCalled, Is.False);

            using (new MixedObjectInstantiationScope(mixinInstance))
            {
                var tx = ClientTransaction.CreateRootTransaction();
                LifetimeService.NewObject(tx, typeof(HookedTargetClass), ParamList.Empty);
            }

            Assert.That(mixinInstance.OnLoadedCalled, Is.False);
            Assert.That(mixinInstance.OnCreatedCalled, Is.True);
            Assert.That(mixinInstance.OnDomainObjectReferenceInitializingCalled, Is.True);
        }
        public void TryGetObjects()
        {
            var notFoundObjectID = new ObjectID(typeof(Order), Guid.NewGuid());

            var deletedObjectID = DomainObjectIDs.Order4;
            var deletedObject   = deletedObjectID.GetObject <Order> ();

            deletedObject.Delete();

            var invalidInstance = Order.NewObject();

            invalidInstance.Delete();
            Assert.That(invalidInstance.State, Is.EqualTo(StateType.Invalid));

            Order[] orders = LifetimeService.TryGetObjects <Order> (
                TestableClientTransaction, DomainObjectIDs.Order1, notFoundObjectID, deletedObjectID, invalidInstance.ID);

            Assert.That(orders, Is.EqualTo(new[] { DomainObjectIDs.Order1.GetObject <Order> (), null, deletedObject, invalidInstance }));
        }
Пример #14
0
        public void GetObjects_DeletedInParentTransaction_Throws()
        {
            var order1 = DomainObjectIDs.Order1.GetObject <Order> ();
            var order3 = DomainObjectIDs.Order3.GetObject <Order> ();
            var order4 = DomainObjectIDs.Order4.GetObject <Order> ();

            order3.Delete();
            order4.Delete();

            ClientTransaction subTransaction = TestableClientTransaction.CreateSubTransaction();

            using (subTransaction.EnterDiscardingScope())
            {
                Assert.That(
                    () => LifetimeService.GetObjects <Order> (subTransaction, order1.ID, order3.ID, order4.ID),
                    Throws.TypeOf <ObjectInvalidException> ().With.Message.EqualTo(
                        "Object 'Order|83445473-844a-4d3f-a8c3-c27f8d98e8ba|System.Guid' is invalid in this transaction."));
            }
        }
Пример #15
0
        public void GetObjects_LoadedObjects()
        {
            ClientTransaction subTransaction = TestableClientTransaction.CreateSubTransaction();

            using (subTransaction.EnterDiscardingScope())
            {
                var expectedObjects = new object[]
                {
                    DomainObjectIDs.Order1.GetObject <Order> (), DomainObjectIDs.Order3.GetObject <Order> (),
                    DomainObjectIDs.OrderItem1.GetObject <OrderItem>()
                };
                DomainObject[] objects = LifetimeService.GetObjects <DomainObject> (
                    subTransaction,
                    DomainObjectIDs.Order1,
                    DomainObjectIDs.Order3,
                    DomainObjectIDs.OrderItem1);
                Assert.That(objects, Is.EqualTo(expectedObjects));
            }
        }
Пример #16
0
        public void TryGetObjects_DeletedInParentTransaction()
        {
            var order1 = DomainObjectIDs.Order1.GetObject <Order> ();
            var order3 = DomainObjectIDs.Order3.GetObject <Order> ();
            var order4 = DomainObjectIDs.Order4.GetObject <Order> ();

            order3.Delete();
            order4.Delete();

            ClientTransaction subTransaction = TestableClientTransaction.CreateSubTransaction();

            using (subTransaction.EnterDiscardingScope())
            {
                var result = LifetimeService.TryGetObjects <Order> (subTransaction, order1.ID, order3.ID, order4.ID);
                Assert.That(result, Is.EqualTo(new[] { order1, order3, order4 }));
                Assert.That(result[1].State, Is.EqualTo(StateType.Invalid));
                Assert.That(result[2].State, Is.EqualTo(StateType.Invalid));
            }
        }
Пример #17
0
        public void RaiseReferenceInitializatingEvent_IDAndActiveTransaction()
        {
            var domainObject = _transaction.ExecuteInScope(() => Order.NewObject()); // indirect call of RaiseReferenceInitializatingEvent

            Assert.That(domainObject.OnReferenceInitializingCalled, Is.True);
            Assert.That(domainObject.OnReferenceInitializingID, Is.EqualTo(domainObject.ID));
            Assert.That(domainObject.OnReferenceInitializingActiveTx, Is.SameAs(_transaction));

            using (ClientTransactionTestHelper.MakeInactive(_transaction))
            {
                Assert.That(_transaction.ActiveTransaction, Is.Not.SameAs(_transaction));

                // Note that GetObjectReference makes _transaction the active transaction.
                var objectReference = (Order)LifetimeService.GetObjectReference(_transaction, DomainObjectIDs.Order1);
                Assert.That(objectReference.OnReferenceInitializingCalled, Is.True);
                Assert.That(objectReference.OnReferenceInitializingID, Is.EqualTo(objectReference.ID));
                Assert.That(objectReference.OnReferenceInitializingActiveTx, Is.SameAs(_transaction));
            }
        }
Пример #18
0
        public void CreateClone_InvokesClonerCallback_OnReferencedObjects()
        {
            var cloneTransaction = ClientTransaction.CreateRootTransaction();

            _cloner.CloneTransaction = cloneTransaction;

            var referencedObject = (ClassWithClonerCallback)LifetimeService.NewObject(TestableClientTransaction, typeof(ClassWithClonerCallback), ParamList.Empty);

            referencedObject.Property = 42;
            _classWithClonerCallback.ReferencedObject = referencedObject;

            var clone = _cloner.CreateClone(_classWithClonerCallback, new CompleteCloneStrategy());
            var clonedReferencedObject = cloneTransaction.ExecuteInScope(() => clone.ReferencedObject);

            Assert.That(clonedReferencedObject.CallbackInvoked, Is.True);
            Assert.That(clonedReferencedObject.CallbackOriginal, Is.SameAs(referencedObject));
            Assert.That(clonedReferencedObject.CallbackCloneTransaction, Is.SameAs(cloneTransaction));
            Assert.That(clonedReferencedObject.CallbackCurrentTransaction, Is.SameAs(ClientTransaction.Current));
            Assert.That(clonedReferencedObject.PropertyValueInCallback, Is.EqualTo(42));
        }
        public void GetObjects_NewObjects_Events()
        {
            var expectedObjects = new DomainObject[] { Order.NewObject(), OrderItem.NewObject() };

            _eventReceiver.Clear();

            var listenerMock = MockRepository.GenerateMock <IClientTransactionListener> ();

            TestableClientTransaction.AddListener(listenerMock);

            LifetimeService.GetObjects <DomainObject> (TestableClientTransaction, expectedObjects[0].ID, expectedObjects[1].ID);
            Assert.That(_eventReceiver.LoadedDomainObjectLists, Is.Empty);

            listenerMock.AssertWasNotCalled(mock => mock.ObjectsLoading(
                                                Arg <ClientTransaction> .Is.Anything,
                                                Arg <ReadOnlyCollection <ObjectID> > .Is.Anything));
            listenerMock.AssertWasNotCalled(mock => mock.ObjectsLoaded(
                                                Arg <ClientTransaction> .Is.Anything,
                                                Arg <ReadOnlyCollection <DomainObject> > .Is.Anything));
        }
Пример #20
0
        public void OnDomainObjectLoaded()
        {
            var tx = CreateTransactionWithStubbedLoading(_objectID);

            var mixinInstance = new HookedDomainObjectMixin();

            Assert.That(mixinInstance.OnLoadedCalled, Is.False);
            Assert.That(mixinInstance.OnCreatedCalled, Is.False);
            Assert.That(mixinInstance.OnDomainObjectReferenceInitializingCalled, Is.False);

            using (new MixedObjectInstantiationScope(mixinInstance))
            {
                LifetimeService.GetObject(tx, _objectID, false);
            }

            Assert.That(mixinInstance.OnLoadedCalled, Is.True);
            Assert.That(mixinInstance.OnLoadedLoadMode, Is.EqualTo(LoadMode.WholeDomainObjectInitialized));
            Assert.That(mixinInstance.OnCreatedCalled, Is.False);
            Assert.That(mixinInstance.OnDomainObjectReferenceInitializingCalled, Is.True);
        }
        public void TryGetObjects_NotFound()
        {
            Order newObject = Order.NewObject();
            var   guid      = new Guid("33333333333333333333333333333333");

            Order[] objects = LifetimeService.TryGetObjects <Order> (
                TestableClientTransaction,
                DomainObjectIDs.Order1,
                newObject.ID,
                new ObjectID(typeof(Order), guid),
                DomainObjectIDs.Order3);
            var expectedObjects = new DomainObject[] {
                DomainObjectIDs.Order1.GetObject <Order> (),
                newObject,
                null,
                DomainObjectIDs.Order3.GetObject <Order> ()
            };

            Assert.That(objects, Is.EqualTo(expectedObjects));
        }
Пример #22
0
        public void DataContainerMapRegistering_MarksNewObjectsInvalid()
        {
            var middleTransaction = CreateSubTransactionAndClearListeners(_rootTransaction);
            var subTransaction    = CreateSubTransactionAndClearListeners(middleTransaction);

            var dataContainer = DataContainer.CreateNew(DomainObjectIDs.Order1);
            var domainObject  = LifetimeService.GetObjectReference(subTransaction, dataContainer.ID);

            dataContainer.SetDomainObject(domainObject);

            _listener.DataContainerMapRegistering(subTransaction, dataContainer);

            Assert.That(_rootTransaction.IsInvalid(DomainObjectIDs.Order1), Is.True);
            Assert.That(ClientTransactionTestHelper.CallGetInvalidObjectReference(_rootTransaction, DomainObjectIDs.Order1), Is.SameAs(domainObject));

            Assert.That(middleTransaction.IsInvalid(DomainObjectIDs.Order1), Is.True);
            Assert.That(ClientTransactionTestHelper.CallGetInvalidObjectReference(middleTransaction, DomainObjectIDs.Order1), Is.SameAs(domainObject));

            Assert.That(subTransaction.IsInvalid(DomainObjectIDs.Order1), Is.False);
        }
Пример #23
0
        public void ResurrectObject_ViaSubTransaction()
        {
            var notFoundID     = new ObjectID(typeof(Order), Guid.NewGuid());
            var notFoundObject = LifetimeService.GetObjectReference(TestableClientTransaction, notFoundID);

            var subTransaction = TestableClientTransaction.CreateSubTransaction();

            using (subTransaction.EnterDiscardingScope())
            {
                notFoundObject.TryEnsureDataAvailable();

                CheckStateIsInvalid(notFoundObject, TestableClientTransaction);
                CheckStateIsInvalid(notFoundObject, subTransaction);

                ResurrectionService.ResurrectInvalidObject(subTransaction, notFoundID);

                CheckStateIsNotInvalid(notFoundObject, TestableClientTransaction, StateType.NotLoadedYet);
                CheckStateIsNotInvalid(notFoundObject, subTransaction, StateType.NotLoadedYet);
            }
        }
Пример #24
0
        public override void SetUp()
        {
            base.SetUp();

            var clientTransaction = ClientTransaction.CreateRootTransaction();
            var sampleObject      = LifetimeService.NewObject(clientTransaction, typeof(SampleObject), ParamList.Empty);

            _objectID = sampleObject.ID;
            clientTransaction.Commit();

            var locator = DefaultServiceLocator.Create();
            var factory = new LinqToSqlExtensionFactory();

            locator.RegisterSingle <IClientTransactionExtensionFactory> (() => factory);
            locator.RegisterSingle <IPersistenceExtensionFactory> (() => factory);
            _serviceLocatorScope = new ServiceLocatorScope(locator);

            _tracingLinqToSqlAppender = new TracingLinqToSqlAppender();
            SetAppender(_tracingLinqToSqlAppender);
        }
Пример #25
0
        public void SingleInheritance_GetObject()
        {
            ObjectID firstDerivedClassObjectID;
            ObjectID secondDerivedClassObjectID;

            using (ClientTransaction.CreateRootTransaction().EnterDiscardingScope())
            {
                var firstDerivedClass = SingleInheritanceFirstDerivedClass.NewObject();
                firstDerivedClassObjectID = firstDerivedClass.ID;
                var secondDerivedClass = SingleInheritanceSecondDerivedClass.NewObject();
                secondDerivedClassObjectID = secondDerivedClass.ID;

                ClientTransaction.Current.Commit();
            }

            using (ClientTransaction.CreateRootTransaction().EnterDiscardingScope())
            {
                Assert.IsInstanceOf(typeof(SingleInheritanceFirstDerivedClass), LifetimeService.GetObject(ClientTransaction.Current, firstDerivedClassObjectID, false));
                Assert.IsInstanceOf(typeof(SingleInheritanceSecondDerivedClass), LifetimeService.GetObject(ClientTransaction.Current, secondDerivedClassObjectID, false));
            }
        }
        public void RelationRead_LongCollection()
        {
            var relationEndPointDefinition = MockRepository.GenerateStub <IRelationEndPointDefinition>();

            relationEndPointDefinition.Stub(n => n.PropertyName).Return("Items");

            var values = new ReadOnlyDomainObjectCollectionAdapter <DomainObject> (
                new DomainObjectCollection(
                    Enumerable.Range(0, 100).Select(i => LifetimeService.NewObject(_clientTransaction, typeof(Client), ParamList.Empty)),
                    null));

            CheckLoggingMethod(
                () => _listener.RelationRead(_clientTransaction, _domainObject, relationEndPointDefinition, values, ValueAccess.Current),
                string.Format(
                    "{0} RelationRead: {1} ({2}, {3}): {4}, +90",
                    _clientTransaction.ID,
                    relationEndPointDefinition.PropertyName,
                    ValueAccess.Current,
                    _domainObject.ID,
                    string.Join(", ", values.Take(10))));
        }
Пример #27
0
        public void GetFlattenedRelatedObjectGraph_WithTraversalFilter_FollowLink_IncludeObject()
        {
            Order order = DomainObjectIDs.Order1.GetObject <Order> ();
            var   graph = new DomainObjectGraphTraverser(order, new TestTraversalStrategy(false, false)).GetFlattenedRelatedObjectGraph();

            var expected = new HashSet <DomainObject> {
                order,
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.OrderTicket1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.OrderItem1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.OrderItem2, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.Customer1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.Official1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.IndustrialSector1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.Partner1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.PartnerWithoutCeo, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.Supplier1, false),
                LifetimeService.GetObject(TestableClientTransaction, DomainObjectIDs.Distributor2, false)
            };

            Assert.That(graph, Is.EquivalentTo(expected));
        }
        private TransportedDomainObjects TransportAndDeleteObjects(params ObjectID[] objectsToLoadAndDelete)
        {
            var transporter = new DomainObjectTransporter();

            foreach (ObjectID id in objectsToLoadAndDelete)
            {
                transporter.Load(id);
            }

            ModifyDatabase(
                delegate
            {
                foreach (var id in objectsToLoadAndDelete)
                {
                    var domainObject = LifetimeService.GetObject(ClientTransaction.Current, id, false);
                    LifetimeService.DeleteObject(ClientTransaction.Current, domainObject);
                }
            });

            return(Transport(transporter));
        }
        private Order PrepareUnsynchronizedOrder(ObjectID orderID, ObjectID relatedCustomerID)
        {
            var unsynchronizedOrder = (Order)LifetimeService.GetObjectReference(TestableClientTransaction, orderID);
            var dataContainer       = DataContainer.CreateForExisting(
                unsynchronizedOrder.ID,
                null,
                pd => pd.PropertyName.EndsWith("Customer") ? relatedCustomerID : pd.DefaultValue);

            dataContainer.SetDomainObject(unsynchronizedOrder);
            TestableClientTransaction.DataManager.RegisterDataContainer(dataContainer);

            var endPointID = RelationEndPointID.Resolve(unsynchronizedOrder, o => o.Customer);
            var endPoint   = (IRealObjectEndPoint)TestableClientTransaction.DataManager.GetRelationEndPointWithoutLoading(endPointID);

            var oppositeID       = RelationEndPointID.CreateOpposite(endPoint.Definition, relatedCustomerID);
            var oppositeEndPoint = TestableClientTransaction.DataManager.GetOrCreateVirtualEndPoint(oppositeID);

            oppositeEndPoint.EnsureDataComplete();

            Assert.That(endPoint.IsSynchronized, Is.False);
            return(unsynchronizedOrder);
        }
        public IBusinessObjectWithIdentity GetObject(BindableObjectClassWithIdentity classWithIdentity, string uniqueIdentifier)
        {
            ArgumentUtility.CheckNotNull("classWithIdentity", classWithIdentity);
            ArgumentUtility.CheckNotNullOrEmpty("uniqueIdentifier", uniqueIdentifier);

            var objectID           = ObjectID.Parse(uniqueIdentifier);
            var domainObjectOrNull = LifetimeService.TryGetObject(ClientTransaction.Current, objectID);

            if (domainObjectOrNull == null)
            {
                return(null);
            }
            if (domainObjectOrNull.State == StateType.Invalid)
            {
                return(null);
            }
            if (domainObjectOrNull.State == StateType.Deleted)
            {
                return(null);
            }
            return((IBusinessObjectWithIdentity)domainObjectOrNull);
        }