public KnowledgeGroupViewModel(
			IRepositoryFactory<ICustomerRepository> repositoryFactory,
			IViewModelsFactory<IKnowledgeGroupViewModel> groupVmFactory,
			ICustomerRepository customerRepository, 
			ICustomerEntityFactory entityFactory, 
			KnowledgeBaseGroup item)
            : base(null, null)
		{
			_repositoryFactory = repositoryFactory;
			_groupVmFactory = groupVmFactory;
            CustomersRepository = customerRepository;
            _originalItem = item;
			InnerItem = _originalItem.DeepClone(entityFactory as IKnownSerializationTypes);
            _innerItem.PropertyChanged += _innerItem_PropertyChanged;
            EmbeddedHierarchyEntry = this;
        }
		public void KnowledgeBaseGroup_AddArticle()
		{
			// create group and arcicle KnowledgeBaseGroups
			var g = new KnowledgeBaseGroup() { Name = "g", Title = "g" };
			var a = new KnowledgeBaseArticle() { Title = "a", Body = "a" };
			string g_Id = g.KnowledgeBaseGroupId;
			string a_Id = a.KnowledgeBaseArticleId;

			var repository = GetRepository();

			EndTestAction.Add((() =>
			{
				repository.Remove(a);
				repository.Remove(g);
				repository.UnitOfWork.Commit();
			}));


			// add created items to DB
			repository.Attach(g);
			repository.Add(g);
			repository.UnitOfWork.Commit();


			a.GroupId = g.KnowledgeBaseGroupId;
			repository.Attach(a);
			repository.Add(a);
			repository.UnitOfWork.Commit();

			//KnowledgeBaseGroup is saved correctly?
			var a_check = repository.KnowledgeBaseArticles.Where(x => x.KnowledgeBaseArticleId == a_Id).SingleOrDefault();
			var g_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == g_Id).SingleOrDefault();

			Assert.IsTrue(g_check != null && g_check.KnowledgeBaseGroupId == g_Id);
			Assert.IsTrue(a_check != null && a_check.KnowledgeBaseArticleId == a_Id && a_check.GroupId == g_check.KnowledgeBaseGroupId);
		}
		public void KnowledgeBaseGroup_AddChild()
		{
			// create two KnowledgeBaseGroups
			var a = new KnowledgeBaseGroup() { Name = "a", Title = "a" };
			var b = new KnowledgeBaseGroup() { Name = "b", Title = "b" };
			string a_Id = a.KnowledgeBaseGroupId;
			string b_Id = b.KnowledgeBaseGroupId;

			var repository = GetRepository();

			EndTestAction.Add((() =>
			{
				repository.Remove(b);
				repository.Remove(a);
				repository.UnitOfWork.Commit();
			}));


			// add created groups to DB
			repository.Attach(a);
			repository.Add(a);
			repository.UnitOfWork.Commit();


			b.Parent = a;
			b.ParentId = a.KnowledgeBaseGroupId;
			repository.Attach(b);
			repository.Add(b);
			repository.UnitOfWork.Commit();

			//KnowledgeBaseGroup is saved correctly?
			var a_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == a_Id).SingleOrDefault();
			var b_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == b_Id).SingleOrDefault();

			Assert.IsTrue(a_check != null && a_check.KnowledgeBaseGroupId == a_Id);
			Assert.IsTrue(b_check != null && b_check.KnowledgeBaseGroupId == b_Id && b_check.ParentId == a_check.KnowledgeBaseGroupId);
		}
		public void KnowledgeBaseGroup_DbOperationTest()
		{
			KnowledgeBaseGroup a = new KnowledgeBaseGroup() { Name = "a", Title = "a" };
			string a_Id = a.KnowledgeBaseGroupId;

			ICustomerRepository repository = GetRepository();
			repository.Attach(a);

			EndTestAction.Add((() =>
			{
				repository.Remove(a);
				repository.UnitOfWork.Commit();
			}));

			// add created group to DB
			repository.Add(a);
			repository.UnitOfWork.Commit();

			//KnowledgeBaseGroup is added to DB correctly?
			KnowledgeBaseGroup a_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == a_Id).SingleOrDefault();
			Assert.IsTrue(a_check != null && a_check.KnowledgeBaseGroupId == a_Id);

			a.Name = "aa";
			repository.UnitOfWork.Commit();
			a_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == a_Id).SingleOrDefault();
			Assert.IsTrue(a_check != null && a_check.KnowledgeBaseGroupId == a_Id && a_check.Name == "aa");

			//KnowledgeBaseGroup delete
			repository.Remove(a);
			repository.UnitOfWork.Commit();


			//KnowledgeBaseGroup is delete correctly
			a_check = repository.KnowledgeBaseGroups.Where(x => x.KnowledgeBaseGroupId == a_Id).SingleOrDefault();
			Assert.IsNull(a_check);
		}
		public void CreateEmptyKnowledgeBaseGroup()
		{
			var client = GetRepository();

			var baseToDb = new KnowledgeBaseGroup();
			baseToDb.Title = "testGroup";
			baseToDb.Name = "testGroup";

			var parentBaseToDb = new KnowledgeBaseGroup();
			parentBaseToDb.Title = "parentGroup";
			parentBaseToDb.Title = "parentGroup";

			baseToDb.ParentId = parentBaseToDb.KnowledgeBaseGroupId;

			client.Add(parentBaseToDb);
			client.Add(baseToDb);

			client.UnitOfWork.Commit();


		}