abstractentityloader.cs

来自「NHibernate NET开发者所需的」· CS 代码 · 共 74 行

CS
74
字号
using System.Collections;
using System.Collections.Generic;
using System.Data;
using log4net;
using NHibernate.Engine;
using NHibernate.Persister.Entity;
using NHibernate.Transform;
using NHibernate.Type;

namespace NHibernate.Loader.Entity
{
	/// <summary>
	/// Abstract superclass for entity loaders that use outer joins
	/// </summary>
	public abstract class AbstractEntityLoader : OuterJoinLoader, IUniqueEntityLoader
	{
		protected static readonly ILog log = LogManager.GetLogger(typeof(AbstractEntityLoader));
		protected readonly IOuterJoinLoadable persister;
		protected readonly IType uniqueKeyType;
		protected readonly string entityName;

		public AbstractEntityLoader(IOuterJoinLoadable persister, IType uniqueKeyType, 
			ISessionFactoryImplementor factory, IDictionary<string, IFilter> enabledFilters)
			: base(factory, enabledFilters)
		{
			this.uniqueKeyType = uniqueKeyType;
			entityName = persister.EntityName;
			this.persister = persister;
		}

		protected override bool IsSingleRowLoader
		{
			get { return true; }
		}

		public object Load(object id, object optionalObject, ISessionImplementor session)
		{
			return Load(session, id, optionalObject, id);
		}

		protected virtual object Load(ISessionImplementor session, object id, object optionalObject, object optionalId)
		{
			IList list = LoadEntity(session, id, uniqueKeyType, optionalObject, entityName, optionalId, persister);

			if (list.Count == 1)
			{
				return list[0];
			}
			else if (list.Count == 0)
			{
				return null;
			}
			else
			{
				if (CollectionOwners != null)
				{
					return list[0];
				}
				else
				{
					throw new HibernateException(
						string.Format("More than one row with the given identifier was found: {0}, for class: {1}", id,
						              persister.EntityName));
				}
			}
		}

		protected override object GetResultColumnOrRow(object[] row, IResultTransformer resultTransformer, IDataReader rs,
		                                               ISessionImplementor session)
		{
			return row[row.Length - 1];
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?