C# 如何使用NHibernate枚举列名?

C# 如何使用NHibernate枚举列名?,c#,nhibernate,inspection,C#,Nhibernate,Inspection,我有一个类,它有许多[ColumnName(“foo”)]NHibernate属性。 有没有一种简单的方法可以让NHibernate列出给定类的所有列名 听起来应该很简单,但我只是在NHibernate文档中没有看到任何检查(或者我今天只是瞎了眼)。使用LINQ和反射: var columns = typeof(TheClass).GetProperties() .Where(property => property.GetCustomAttributes(typeof(Colum

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


听起来应该很简单,但我只是在NHibernate文档中没有看到任何检查(或者我今天只是瞎了眼)。

使用LINQ和反射:

var columns = typeof(TheClass).GetProperties()
    .Where(property => property.GetCustomAttributes(typeof(ColumnNameAttribute), false).Count > 0)
    .Select(property => property.Name);

使用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映射或。这使得它比单独使用反射更稳定、更可靠。

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

对我有用的是:

PersistentClass persistentClass = cfg.GetClassMapping(typeof(MyEntity));
Property property = persistentClass.GetProperty(propertyName);
property.ColumnIterator   // <-- the column(s) for the property
PersistentClass PersistentClass=cfg.GetClassMapping(typeof(MyEntity));
Property=persistentClass.GetProperty(propertyName);

property.ColumnIterator//如何获取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 );