private async void OnOpenDetailView(OpenDetailViewEventArgs args)
        {
            var detailViewModel = DetailViewModels.SingleOrDefault(vm => vm.Id == args.Id &&
                                                                   vm.GetType().Name == args.ViewModelName);

            if (detailViewModel == null)
            {
                detailViewModel = _detailViewModelCreator[args.ViewModelName];
                try
                {
                    await detailViewModel.LoadAsync(args.Id);
                }
                catch
                {
                    await _messageDialogService.ShowInfoAsync("Could not load entity, " +
                                                              "maybe it was deleted in the meantime by another user, " +
                                                              "Navigation will be refreshed for you.");

                    await NavigationViewModel.LoadAsync();

                    return;
                }
                DetailViewModels.Add(detailViewModel);
            }

            SelectedDetailViewModel = detailViewModel;
        }
        protected async Task SaveWithOptimistcConcurencyAsync(Func <Task> saveFunc, Action afterSaveAction)
        {
            try
            {
                await saveFunc();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                var databaseValues = ex.Entries.Single().GetDatabaseValues();
                if (databaseValues == null)
                {
                    await MessageDialogService.ShowInfoAsync("The entity has been deleted by someone else");

                    RaiseDetailDeletedEvent(Id);
                    return;
                }

                var result = await MessageDialogService.ShowOkCancelDialogAsync("The entity has been changed in" +
                                                                                "the meantime by someone else. Click Ok to save your changes anyway, orclick Cancel " +
                                                                                "to reload entity from database", "Question");

                if (result == MessageDialogResult.OK)
                {
                    //Update Original values with database values
                    var entry = ex.Entries.Single();
                    entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                    await saveFunc();
                }
                else
                {
                    await ex.Entries.Single().ReloadAsync();
                    await LoadAsync(Id);
                }
            }
            afterSaveAction();
        }