Example #1
0
        /// <summary>
        /// 获得MasterDetail下的Detail Property Name
        /// </summary>
        /// <param name="sessionFactory"></param>
        /// <param name="masterType"></param>
        /// <param name="detailType"></param>
        /// <returns></returns>
        public static string GetOnetoManyPropertyName(ISessionFactory sessionFactory, Type masterType, Type detailType)
        {
            if (!s_collectionPropertyNames.ContainsKey(detailType))
            {
                s_collectionPropertyNames[detailType] = new Dictionary <Type, string>();
            }
            if (!s_collectionPropertyNames[detailType].ContainsKey(masterType))
            {
                NHibernate.Metadata.IClassMetadata metadata = sessionFactory.GetClassMetadata(detailType.FullName);

                for (int i = 0; i < metadata.PropertyTypes.Length; ++i)
                {
                    NHibernate.Type.ManyToOneType manyToOneType = metadata.PropertyTypes[i] as NHibernate.Type.ManyToOneType;
                    if (manyToOneType != null && manyToOneType.ReturnedClass == masterType)
                    {
                        s_collectionPropertyNames[detailType][masterType] = metadata.PropertyNames[i];
                        break;
                    }

                    NHibernate.Type.OneToOneType oneToOneType = metadata.PropertyTypes[i] as NHibernate.Type.OneToOneType;
                    if (oneToOneType != null && oneToOneType.ReturnedClass == masterType)
                    {
                        s_collectionPropertyNames[detailType][masterType] = metadata.PropertyNames[i];
                        break;
                    }
                }
            }

            return(s_collectionPropertyNames[detailType][masterType]);
        }
Example #2
0
        public Repository(ISessionFactory sessionFactory, ISession session)
        {
            this.session        = session ?? throw new ArgumentNullException("session", "未能获取 ISession的实例。");
            this.sessionFactory = sessionFactory ?? throw new ArgumentNullException("sessionFactory", "仓储层需要根据 ISessionFactory 获取Session,但未能获取 ISessionFactory 的实例。");

            ClassMetadata          = sessionFactory.GetClassMetadata(persistentClass);
            identifierPropertyName = ClassMetadata.IdentifierPropertyName;
            entityName             = ClassMetadata.EntityName;
            queryAllString         = $"from {entityName}";
            allQuery = new DetachedQuery($"from {entityName}");

            allCountQuery     = new DetachedQuery($"select count(*) from {entityName}");
            inIdentitiesQuery = new DetachedQuery($"from {entityName} where {identifierPropertyName} in (:identities)");
        }
        private string CreateQueryString(ISearchExpression searchExpression, IList <ISearchOrder> searchOrders, NHibernate.ISessionFactory sessionFactory, Dictionary <string, object> paramNames)
        {
            if (searchExpression is QueryExpression)
            {
                return((searchExpression as QueryExpression).Query);
            }

            NHibernate.Metadata.IClassMetadata metaData = sessionFactory.GetClassMetadata(typeof(T));

            StringBuilder sb = new StringBuilder();

            sb.Append("from ");
            sb.Append(metaData.EntityName);
            sb.Append(" as Current ");
            if (searchExpression != null)
            {
                sb.Append("where ");
                sb.Append(GetQueryWhere(searchExpression, sessionFactory, paramNames));
            }

            if (searchOrders != null && searchOrders.Count > 0)
            {
                sb.Append("order by ");
                for (int i = 0; i < searchOrders.Count; ++i)
                {
                    sb.Append(GetQueryOrder(searchOrders[i]));
                    if (i != searchOrders.Count - 1)
                    {
                        sb.Append(",");
                    }
                }
            }

            // Eager Fetch
            if (this.EagerFetchs != null)
            {
                foreach (string s in this.EagerFetchs)
                {
                    sb.Append(" left join fetch Current.");
                    sb.Append(s);
                }
            }

            return(sb.ToString());
        }
Example #4
0
        /// <summary>
        /// GetId
        /// </summary>
        /// <param name="sessionFactory"></param>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static object GetId(ISessionFactory sessionFactory, object entity)
        {
            if (entity == null)
            {
                return(null);
            }
            Type entityType = entity.GetType();

            NHibernate.Metadata.IClassMetadata entityMeta = sessionFactory.GetClassMetadata(entityType);
            if (entityMeta != null)
            {
                return(entityMeta.GetIdentifier(entity, EntityMode.Map));
            }
            else
            {
                return(null);
            }
        }
        private string CreateQueryCountString(ISearchExpression searchExpression, NHibernate.ISessionFactory sessionFactory, Dictionary <string, object> paramNames)
        {
            if (searchExpression is QueryExpression)
            {
                string s = (searchExpression as QueryExpression).Query;

                int idx;
                //// remove joins
                //string[] joins = new string[] { "inner join", "left outer join", "right outer join", "full outer join", "left join", "right join", "full join" };
                //
                //foreach(string join in joins)
                //{
                //    idx = s.IndexOf(join);
                //    if (idx != -1)
                //    {
                //        s = s.Substring(0, idx).Trim();
                //    }
                //}

                idx = s.IndexOf("from");
                if (idx != -1)
                {
                    s = s.Substring(idx);
                }
                return("select count(*) " + s);
            }

            NHibernate.Metadata.IClassMetadata metaData = sessionFactory.GetClassMetadata(typeof(T));

            StringBuilder sb = new StringBuilder();

            sb.Append("select count(*) ");
            sb.Append("from ");
            sb.Append(metaData.EntityName);
            sb.Append(" ");
            if (searchExpression != null)
            {
                sb.Append("where ");

                sb.Append(GetQueryWhere(searchExpression, sessionFactory, paramNames));
            }
            return(sb.ToString());
        }
Example #6
0
        /// <summary>
        /// 根据Metadata得到属性类型(Path以:或者.分割,如果是Collection,则返回Collection的内部Type)
        /// </summary>
        /// <param name="sessionFactory"></param>
        /// <param name="type"></param>
        /// <param name="fullPropertyName"></param>
        /// <param name="hasCollection"></param>
        /// <returns></returns>
        public static Type GetPropertyType(ISessionFactory sessionFactory, Type type, string fullPropertyName, out bool hasCollection)
        {
            hasCollection = false;
            if (string.IsNullOrEmpty(fullPropertyName))
            {
                return(null);
            }
            string dictKey = type.ToString() + "#" + fullPropertyName;

            lock (s_propertyTypesHasCollection)
            {
                if (!s_propertyTypes.ContainsKey(dictKey))
                {
                    NHibernate.Metadata.IClassMetadata classMetadata = sessionFactory.GetClassMetadata(type);
                    if (classMetadata == null)
                    {
                        throw new NotSupportedException("There is no Metadata of type " + type.ToString());
                    }
                    NHibernate.Type.IType destType = null;
                    Type innerType = null;

                    NHibernate.Type.ComponentType componentType = null;
                    string[] ss = fullPropertyName.Split(new char[] { ':', '.' });
                    for (int i = 0; i < ss.Length; ++i)
                    {
                        TryRemoveJoinTypeChar(ref ss[i]);
                        if (componentType == null)
                        {
                            destType = classMetadata.GetPropertyType(ss[i]);
                        }
                        else
                        {
                            for (int j = 0; j < componentType.PropertyNames.Length; ++j)
                            {
                                if (componentType.PropertyNames[j] == ss[i])
                                {
                                    destType = componentType.Subtypes[j];
                                    break;
                                }
                            }
                        }
                        componentType = destType as NHibernate.Type.ComponentType;

                        if (componentType == null)
                        {
                            if (destType.IsCollectionType)
                            {
                                //System.Collections.Generic.IList`1[[Hd.Model.Jk2.进口其他业务箱, Hd.Model.Jk2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
                                innerType     = Feng.Utils.ReflectionHelper.GetGenericUnderlyingType(destType.ReturnedClass);
                                classMetadata = sessionFactory.GetClassMetadata(innerType);

                                hasCollection = true;
                            }
                            else
                            {
                                classMetadata = sessionFactory.GetClassMetadata(destType.ReturnedClass);
                            }
                        }
                    }

                    if (!destType.IsCollectionType)
                    {
                        s_propertyTypes[dictKey] = destType.ReturnedClass;
                    }
                    else
                    {
                        s_propertyTypes[dictKey] = innerType;
                    }

                    s_propertyTypesHasCollection[dictKey] = hasCollection;
                }

                hasCollection = s_propertyTypesHasCollection[dictKey];
                return(s_propertyTypes[dictKey]);
            }
        }
Example #7
0
        private void tsbAttachment_Click(object sender, EventArgs e)
        {
            if (this.AttachmentForm == null)
            {
                return;
            }

            object entity = this.DisplayManager.CurrentItem;

            if (entity == null)
            {
                MessageForm.ShowWarning("请选择当前行!");
                return;
            }

            Type entityType = entity.GetType();
            var  sm         = ServiceProvider.GetService <Feng.NH.ISessionFactoryManager>();

            if (sm == null)
            {
                return;
            }
            NHibernate.ISessionFactory sessionFactory = sm.GetSessionFactory(Feng.Utils.RepositoryHelper.GetConfigNameFromType(entityType));
            if (sessionFactory == null)
            {
                return;
            }

            bool hasCollection;

            int idx = m_attachmentEntityIdExp.LastIndexOf('.');

            if (idx != -1)
            {
                string navi = m_attachmentEntityIdExp.Substring(0, idx);
                entityType = Feng.NH.NHibernateHelper.GetPropertyType(sessionFactory, entityType, navi, out hasCollection);
            }

            NHibernate.Metadata.IClassMetadata metaData = sessionFactory.GetClassMetadata(entityType);
            string entityName = metaData.EntityName;
            object id         = EntityScript.GetPropertyValue(entity, m_attachmentEntityIdExp);
            string entityId;

            //object id = EntityHelper.GetPropertyValue(entity, metaData.IdentifierPropertyName);
            if (id != null)
            {
                entityId = id.ToString();
            }
            else
            {
                MessageForm.ShowWarning("当前行无Id!");
                return;
            }

            string formText = entityName + ":" + entityId;
            IArhiveOperationMasterForm form = this.AttachmentForm;
            var form2 = form as ArchiveSeeForm;

            form2.tsbSearch.Visible = false;
            form.Text = formText + " 的附件";
            form.Show();
            form.DoView();

            form.DisplayManager.SearchManager.LoadData(SearchExpression.And(
                                                           SearchExpression.Eq("EntityName", entityName), SearchExpression.Eq("EntityId", entityId)), null);

            m_attachmentEntityName = entityName;
            m_attachmentEntityId   = entityId;
            //(form.ControlManager.Dao as BaseDao<AttachmentInfo>).EntityOperating += new EventHandler<OperateArgs<AttachmentInfo>>(delegate(object sender1, OperateArgs<AttachmentInfo> e1)
            //{
            //    e1.Entity.EntityName = entityName;
            //    e1.Entity.EntityId = entityId;
            //});

            (form.ControlManager.Dao as BaseDao <AttachmentInfo>).EntityOperating -= new EventHandler <OperateArgs <AttachmentInfo> >(AttachmentForm_EntityOperating);
            (form.ControlManager.Dao as BaseDao <AttachmentInfo>).EntityOperating += new EventHandler <OperateArgs <AttachmentInfo> >(AttachmentForm_EntityOperating);
        }