2009-04-15 113 views
4

我有一堆[ColumnName(「foo」)] NHibernate屬性的類。 有沒有一種簡單的方法可以讓NHibernate列出給定類的所有ColumnNames?如何用NHibernate枚舉列名?

聽起來好像應該很簡單,但我在NHibernate文檔中沒有看到任何檢查(或者我今天只是盲目地)。

回答

2

使用LINQ和反思:

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

使用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。這使得它比使用自己的反射更穩定,更可靠。

7

我有同樣的問題,但發現IClassMetadata沒有任何列信息,只是屬性類型,名稱,標識符和表信息。

什麼工作對我來說:

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

如何獲得通過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); 

沐浴在這個真棒的榮耀:)

+0

我已經修改它,現在工作與組件的映射實體!沿着這些相同的方向,創建屬性名稱/數據庫列名稱字典可能會很有用。我已經發布該解決方案在這裏:http://stackoverflow.com/questions/1800930/getting-class-field-names-and-table-column-names-from-nhibernate-metadata/8425996#8425996 – 2011-12-12 18:09:04