예제 #1
0
        public static bool IsStale(Domain.IDomainModelClass domainModelClass, out string entityName, out object identifier)
        {
            var    _entityName = "";
            object _identifier = null;

            entityName = _entityName;
            identifier = _identifier;
            if (!MustCheck(domainModelClass))
            {
                return(false);
            }
            try
            {
                bool isStale = false;


#if NETFRAMEWORK
                var miniSessionManager = MiniSessionManager.InstanceSafe;
#else
                var miniSessionManager = ServiceLocator.Current.GetInstance <IMiniSessionService>();
#endif

                var entityInfo = GetEntityInfo(miniSessionManager, domainModelClass);
                if (!entityInfo.IsVersioned)
                {
                    return(false);
                }
                _entityName = entityInfo.EntityType.Name;
                var    tableName = entityInfo.ClassMetaData.RootTableName;
                string _entityID = entityInfo.ClassMetaData.IdentifierPropertyName;
                _identifier = (domainModelClass.GetType().GetProperty(_entityID)).GetValue(domainModelClass, null);
                string currentTimestampString = (domainModelClass.GetType().GetProperty("VersionTimestamp")).GetValue(domainModelClass, null)?.ToString();
                int    currentTimestamp       = 0;
                if (int.TryParse(currentTimestampString, out int cts))
                {
                    currentTimestamp = cts;
                }
                var sql      = $"select 1 from {tableName} where {_entityID} = :idValue and VersionTimestamp > :currentTimestamp";
                var sqlQuery = miniSessionManager.Session.CreateSQLQuery(sql).SetParameter("idValue", _identifier).SetParameter("currentTimestamp", currentTimestamp);
                isStale = sqlQuery.List().Count > 0;

                entityName = _entityName;
                identifier = _identifier;
                return(isStale);
            }
            catch (Exception e)
            {
                LogManager.GetLogger(typeof(StaleDataManager)).Error($"Error while examining Entity [{entityName}]", e);
                return(false);
            }
        }
예제 #2
0
        private static bool MustCheck(Domain.IDomainModelClass cls)
        {
            var domainModelClassTypeFullName = cls.GetType().FullName;

            if (entityInfos.ContainsKey(domainModelClassTypeFullName) && !entityInfos[domainModelClassTypeFullName].IsVersioned)
            {
                return(false);
            }
            return(true);
        }
예제 #3
0
        private static EntityInfo GetEntityInfo(IMiniSessionService manager, Domain.IDomainModelClass domainModelClass)
#endif
        {
            EntityInfo entityInfo;
            var        domainModelClassType = domainModelClass.GetType();

            if (entityInfos.ContainsKey(domainModelClassType.FullName))
            {
                entityInfo = entityInfos[domainModelClassType.FullName];
            }
            else
            {
                entityInfo                  = new EntityInfo();
                entityInfo.EntityType       = domainModelClass.GetType();
                entityInfo.ClassMetaData    = ((AbstractEntityPersister)manager.Session.SessionFactory.GetAllClassMetadata()[entityInfo.EntityType.FullName]);
                entityInfo.IsVersioned      = entityInfo.ClassMetaData?.IsVersioned == true && entityInfo.ClassMetaData?.VersionType?.Name == "Int32";
                entityInfo.DomainModelClass = domainModelClass;
                entityInfos.TryAdd(domainModelClassType.FullName, entityInfo);
            }
            return(entityInfo);
        }