我有一堆[ColumnName(「foo」)] NHibernate屬性的類。 有沒有一種簡單的方法可以讓NHibernate列出給定類的所有ColumnNames?如何用NHibernate枚舉列名?
聽起來好像應該很簡單,但我在NHibernate文檔中沒有看到任何檢查(或者我今天只是盲目地)。
我有一堆[ColumnName(「foo」)] NHibernate屬性的類。 有沒有一種簡單的方法可以讓NHibernate列出給定類的所有ColumnNames?如何用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映射或FluentNHibernate。這使得它比使用自己的反射更穩定,更可靠。
我有同樣的問題,但發現IClassMetadata沒有任何列信息,只是屬性類型,名稱,標識符和表信息。
什麼工作對我來說:
PersistentClass persistentClass = cfg.GetClassMapping(typeof(MyEntity));
Property property = persistentClass.GetProperty(propertyName);
property.ColumnIterator // <-- the column(s) for the property
如何獲得通過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);
沐浴在這個真棒的榮耀:)
我已經修改它,現在工作與組件的映射實體!沿着這些相同的方向,創建屬性名稱/數據庫列名稱字典可能會很有用。我已經發布該解決方案在這裏:http://stackoverflow.com/questions/1800930/getting-class-field-names-and-table-column-names-from-nhibernate-metadata/8425996#8425996 – 2011-12-12 18:09:04