public SyncProcessor(IResxLoader resourceFileLoader, RftContext ctx)
        {
            _resourceFileLoader = resourceFileLoader;
            _resourceReader = new ResxStringResourceReader();

            GetContext = () => ctx;
        }
        public void ReadFromBranch500()
        {
            using (var txScope = new TransactionScope())
            {
                using (var ctx = new RftContext())
                {
                    var translations = ctx.Translations.Where(t => t.FK_BranchId == 500).ToList();
                    Assert.That(translations.Count, Is.EqualTo(2));

                    //ctx.Translations.RemoveRange(translations);
                    //ctx.SaveChanges();
                }
            }
        }
        // Why Add & Update in one method: because of the way how we don't delete translations
        // It could be that on adding a "new" resource, it already exists as translation from a previous commit & rollback
        public void AddOrUpdateTranslationsForResourceString(RftContext ctx, ResourceString dbRes)
        {
            int branchId = dbRes.FK_BranchId;
            int resourceFileId = dbRes.FK_ResourceFileId;
            string resourceIdentifier = dbRes.ResourceIdentifier;
            string resxValue = dbRes.ResxValue;

            foreach (var l in _languages)
            {
                string culture = l.Culture;

                var currentTranslation = ctx.Translations
                    .FirstOrDefault(t => t.FK_ResourceFileId == resourceFileId &&
                            t.ResourceIdentifier == resourceIdentifier &&
                            t.Culture == culture &&
                            t.FK_BranchId == branchId);

                int excludeTranslationId = -1;
                if (currentTranslation != null)
                {
                    // we are reviving an existing translation for this resource string
                    excludeTranslationId = currentTranslation.Id;
                }
                else
                {
                    currentTranslation = new Translation()
                    {
                        FK_BranchId = branchId,
                        FK_ResourceFileId = resourceFileId,
                        ResourceIdentifier = resourceIdentifier,
                        Culture = culture,
                        OriginalResxValueAtTranslation = resxValue,
                        LastUpdated = DateTime.UtcNow,
                        LastUpdatedBy = "sync task"
                    };
                    ctx.Translations.Add(currentTranslation);
                }

                var mergeFromTranslation = ctx.Translations
                          .Where(t => t.ResourceIdentifier == resourceIdentifier &&
                                  t.OriginalResxValueAtTranslation == resxValue &&    // NOTE: this is SQL Server comparing here!!!
                                  t.Culture == culture)
                          .OrderByDescending(t => t.LastUpdated)
                          .FirstOrDefault();
                // Note: mergeFromTranslation may be equal to currentTranslation when reviving a translation

                if (null == mergeFromTranslation)
                {
                    if (-1 == excludeTranslationId)
                    {
                        currentTranslation.TranslatedValue = null;
                    }
                    currentTranslation.OriginalResxValueChangedSinceTranslation = true;
                }
                else
                {
                    currentTranslation.OriginalResxValueChangedSinceTranslation = false;
                    currentTranslation.TranslatedValue = mergeFromTranslation.TranslatedValue;
                    currentTranslation.LastUpdated = mergeFromTranslation.LastUpdated;
                    currentTranslation.LastUpdatedBy = mergeFromTranslation.LastUpdatedBy;
                }
            }
        }