代码之家  ›  专栏  ›  技术社区  ›  Ken

如何用nhibernate枚举列名?

  •  4
  • Ken  · 技术社区  · 16 年前

    我有一个类,它有许多[columnname(“foo”)]nhibernate属性。 有没有一种简单的方法可以让nhibernate列出给定类的所有列名称?

    这听起来应该很容易,但我只是没有看到任何形式的检查,在NHibernate文件(或可能我只是瞎了今天)。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Mehrdad Afshari    16 年前

    使用LINQ和反射:

    var columns = typeof(TheClass).GetProperties()
        .Where(property => property.GetCustomAttributes(typeof(ColumnNameAttribute), false).Count > 0)
        .Select(property => property.Name);
    
        2
  •  7
  •   srini.venigalla    16 年前

    我有同样的问题,但发现iclassmetadata没有任何列信息,只有属性类型、名称、标识符和表信息。

    为我工作的是:

    PersistentClass persistentClass = cfg.GetClassMapping(typeof(MyEntity));
    Property property = persistentClass.GetProperty(propertyName);
    property.ColumnIterator   // <-- the column(s) for the property
    
        3
  •  6
  •   Randy Burden    12 年前

    如何获取由nhibernate映射的实体的数据库列名:

    using System;
    using System.Collections.Generic;
    using NHibernate;
    using NHibernate.Persister.Entity;
    
    namespace Stackoverflow.Example
    {
        /// <summary>
        /// NHibernate helper class
        /// </summary>
        /// <remarks>
        /// Assumes you are using NHibernate version 3.1.0.4000 or greater (Not tested on previous versions)
        /// </remarks>
        public class NHibernateHelper
        {
            /// <summary>
            /// Gets the list of database column names for an entity
            /// </summary>
            /// <param name="sessionFactory">NHibernate SessionFactory</param>
            /// <param name="entity">A mapped entity</param>
            /// <returns>List of column names</returns>
            public static IEnumerable<string> GetPropertyColumnNames(ISessionFactory sessionFactory, object entity)
            {
                Type entityType = entity == null ? null : entity.GetType();
    
                List<string> columnNameList = null;
    
                // This has some cool methods and properties so check it out
                var metaData = entityType == null ? null : sessionFactory.GetClassMetadata(entityType.ToString());
    
                //- metaData validity check ... will be null if provided type is not mapped
                if (metaData != null)
                {
                    // This has some even cooler methods and properties so definitely check this out
                    var entityPersister = (AbstractEntityPersister) metaData;
    
                    //- how to get the entity's identifier
                    //- string entityIdentifier = metaData.IdentifierPropertyName;
    
                    //- Get the database identifier
                    //- can have multiple in case of composite keys
                    IEnumerable<string> dbIdentifierNameList = entityPersister.KeyColumnNames;
    
                    var propertyNameList = entityPersister.PropertyNames;
    
                    // Adding the database identifier first
                    columnNameList = new List<string>(dbIdentifierNameList);
                    //- then add properties column names
                    foreach (var propertyName in propertyNameList)
                    {
                        var columnNameArray = entityPersister.GetPropertyColumnNames(propertyName);
                        columnNameList.AddRange(columnNameArray.Where(columnName => dbIdentifierNameList.Contains(columnName) == false));
                    }
                }
    
                return columnNameList;
            }
        }
    }   
    

    用途:

    // Get your NHiberate SessionFactory wherever that is in your application
    var sessionFactory = NHibernateHelper.SessionFactory;
    
    // Get an entity that you know is mapped by NHibernate
    var customer = new Customer();
    
    // Get a list of the database column names for the entity
    var columnNames = 
            Stackoverflow.Example.NHibernateHelper.GetPropertyColumnNames( sessionFactory, customer );
    

    沐浴在这令人敬畏的荣耀中:)

        4
  •  2
  •   Stefan Steinegger    16 年前

    使用nhibernate的元数据

    // get an instance to the metadata 
    IClassMetadata metadata = sessionfactory.GetClassMetadata(typeof(MyEntity));
    
    // use properties and methods from the metadata:
    // metadata.PropertyNames
    // metadata.PropertyTypes
    // metadata.GetIdentifier()
    // and more
    
    // or get the metadata for all classes at once
    IDictionary allClassMetaData = factory.GetAllClassMetadata();
    metadata = allClassMetaData[typeof(MyEntity)];
    

    您可以得到nhibernate实际知道的内容,而不依赖于它的定义;使用属性、XML映射或 FluentNHibernate . 这使得它比单独使用反射更稳定、更可靠。

    推荐文章