Click here to Skip to main content
15,893,266 members
Articles / Database Development / SQL Server

Ready-to-use Mass Emailing Functionality with C#, .NET 2.0, and Microsoft® SQL Server 2005 Service Broker

Rate me:
Please Sign up or sign in to vote.
4.84/5 (40 votes)
7 Sep 200613 min read 298.6K   4.6K   210  
This paper demonstrates an extensible mass emailing framework (Smart Mass Email SME). The demo implementation uses cutting edge .NET technologies available today such as C#, .NET 2.0, Microsoft® SQL Server 2005 Service Broker, MS Provider Pattern, Enterprise Library January 2006 etc.
	
/*
	File generated by NetTiers templates [www.nettiers.com]
	Generated on : Friday, 1 September 2006
	Important: Do not modify this file. Edit the file EmailMessage.cs instead.
*/

#region using directives

using System;
using System.ComponentModel;
using System.Collections;
using System.Xml.Serialization;
using System.Runtime.Serialization;

#endregion

namespace SmartMassEmail.Entities
{
	#region EmailMessageEventArgs class
	/// <summary>
	/// Provides data for the ColumnChanging and ColumnChanged events.
	/// </summary>
	/// <remarks>
	/// The ColumnChanging and ColumnChanged events occur when a change is made to the value 
	/// of a property of a <see cref="EmailMessage"/> object.
	/// </remarks>
	public class EmailMessageEventArgs : System.EventArgs
	{
		private EmailMessageColumn column;
		
		///<summary>
		/// Initalizes a new Instance of the EmailMessageEventArgs class.
		///</summary>
		public EmailMessageEventArgs(EmailMessageColumn column)
		{
			this.column = column;
		}
		
		
		///<summary>
		/// The EmailMessageColumn that was modified, which has raised the event.
		///</summary>
		///<value cref="EmailMessageColumn" />
		public EmailMessageColumn Column { get { return this.column; } }
	}
	#endregion
	
	
	///<summary>
	/// Define a delegate for all EmailMessage related events.
	///</summary>
	public delegate void EmailMessageEventHandler(object sender, EmailMessageEventArgs e);
	
	///<summary>
	/// An object representation of the 'EmailMessage' table. [No description found the database]	
	///</summary>
	[Serializable, DataObject]
	[CLSCompliant(true)]
	//[ToolboxItem(typeof(EmailMessage))]
	public abstract partial class EmailMessageBase : EntityBase, IEntityId<EmailMessageKey>, System.IComparable, System.ICloneable, IEditableObject, IComponent, INotifyPropertyChanged
	{		
		#region Variable Declarations
		
		/// <summary>
		/// 	Old the inner data of the entity.
		/// </summary>
		private EmailMessageEntityData entityData;
		
		// <summary>
		// 	Old the original data of the entity.
		// </summary>
		//EmailMessageEntityData originalData;
		
		/// <summary>
		/// 	Old a backup of the inner data of the entity.
		/// </summary>
		private EmailMessageEntityData backupData; 
		
		/// <summary>
		/// 	Key used if Tracking is Enabled for the <see cref="EntityLocator" />.
		/// </summary>
		private string entityTrackingKey;
		
		[NonSerialized]
		private TList<EmailMessage> parentCollection;
		private bool inTxn = false;

		
		/// <summary>
		/// Occurs when a value is being changed for the specified column.
		/// </summary>	
		[field:NonSerialized]
		public event EmailMessageEventHandler ColumnChanging;
		
		
		/// <summary>
		/// Occurs after a value has been changed for the specified column.
		/// </summary>
		[field:NonSerialized]
		public event EmailMessageEventHandler ColumnChanged;		
		#endregion "Variable Declarations"
		
		#region Constructors
		///<summary>
		/// Creates a new <see cref="EmailMessageBase"/> instance.
		///</summary>
		public EmailMessageBase()
		{
			this.entityData = new EmailMessageEntityData();
			this.backupData = null;
		}		
		
		///<summary>
		/// Creates a new <see cref="EmailMessageBase"/> instance.
		///</summary>
		///<param name="emailMessageID"></param>
		///<param name="emailMessageChangeStamp"></param>
		///<param name="emailMessagePriority"></param>
		///<param name="emailMessageStatus"></param>
		///<param name="emailMessageNumberOfRetry"></param>
		///<param name="emailMessageRetryTime"></param>
		///<param name="emailMessageMaximumRetry"></param>
		///<param name="emailMessageExpiryDatetime"></param>
		///<param name="emailMessageArrivedDateTime"></param>
		///<param name="emailMessageSenderInfo"></param>
		///<param name="emailMessageEmailTo"></param>
		///<param name="emailMessageEmailFrom"></param>
		///<param name="emailMessageEmailSubject"></param>
		///<param name="emailMessageEmailBody"></param>
		///<param name="emailMessageEmailCC"></param>
		///<param name="emailMessageEmailBCC"></param>
		///<param name="emailMessageIsHtml"></param>
		public EmailMessageBase(System.Guid emailMessageID, System.DateTime emailMessageChangeStamp, System.Int32 emailMessagePriority, 
			System.Int32 emailMessageStatus, System.Int32 emailMessageNumberOfRetry, System.DateTime emailMessageRetryTime, System.Int32 emailMessageMaximumRetry, 
			System.DateTime emailMessageExpiryDatetime, System.DateTime emailMessageArrivedDateTime, System.String emailMessageSenderInfo, 
			System.String emailMessageEmailTo, System.String emailMessageEmailFrom, System.String emailMessageEmailSubject, System.String emailMessageEmailBody, 
			System.String emailMessageEmailCC, System.String emailMessageEmailBCC, System.Boolean emailMessageIsHtml)
		{
			this.entityData = new EmailMessageEntityData();
			this.backupData = null;

			this.ID = emailMessageID;
			this.ChangeStamp = emailMessageChangeStamp;
			this.Priority = emailMessagePriority;
			this.Status = emailMessageStatus;
			this.NumberOfRetry = emailMessageNumberOfRetry;
			this.RetryTime = emailMessageRetryTime;
			this.MaximumRetry = emailMessageMaximumRetry;
			this.ExpiryDatetime = emailMessageExpiryDatetime;
			this.ArrivedDateTime = emailMessageArrivedDateTime;
			this.SenderInfo = emailMessageSenderInfo;
			this.EmailTo = emailMessageEmailTo;
			this.EmailFrom = emailMessageEmailFrom;
			this.EmailSubject = emailMessageEmailSubject;
			this.EmailBody = emailMessageEmailBody;
			this.EmailCC = emailMessageEmailCC;
			this.EmailBCC = emailMessageEmailBCC;
			this.IsHtml = emailMessageIsHtml;
		}
		
		///<summary>
		/// A simple factory method to create a new <see cref="EmailMessage"/> instance.
		///</summary>
		///<param name="emailMessageID"></param>
		///<param name="emailMessageChangeStamp"></param>
		///<param name="emailMessagePriority"></param>
		///<param name="emailMessageStatus"></param>
		///<param name="emailMessageNumberOfRetry"></param>
		///<param name="emailMessageRetryTime"></param>
		///<param name="emailMessageMaximumRetry"></param>
		///<param name="emailMessageExpiryDatetime"></param>
		///<param name="emailMessageArrivedDateTime"></param>
		///<param name="emailMessageSenderInfo"></param>
		///<param name="emailMessageEmailTo"></param>
		///<param name="emailMessageEmailFrom"></param>
		///<param name="emailMessageEmailSubject"></param>
		///<param name="emailMessageEmailBody"></param>
		///<param name="emailMessageEmailCC"></param>
		///<param name="emailMessageEmailBCC"></param>
		///<param name="emailMessageIsHtml"></param>
		public static EmailMessage CreateEmailMessage(System.Guid emailMessageID, System.DateTime emailMessageChangeStamp, System.Int32 emailMessagePriority, 
			System.Int32 emailMessageStatus, System.Int32 emailMessageNumberOfRetry, System.DateTime emailMessageRetryTime, System.Int32 emailMessageMaximumRetry, 
			System.DateTime emailMessageExpiryDatetime, System.DateTime emailMessageArrivedDateTime, System.String emailMessageSenderInfo, 
			System.String emailMessageEmailTo, System.String emailMessageEmailFrom, System.String emailMessageEmailSubject, System.String emailMessageEmailBody, 
			System.String emailMessageEmailCC, System.String emailMessageEmailBCC, System.Boolean emailMessageIsHtml)
		{
			EmailMessage newEmailMessage = new EmailMessage();
			newEmailMessage.ID = emailMessageID;
			newEmailMessage.ChangeStamp = emailMessageChangeStamp;
			newEmailMessage.Priority = emailMessagePriority;
			newEmailMessage.Status = emailMessageStatus;
			newEmailMessage.NumberOfRetry = emailMessageNumberOfRetry;
			newEmailMessage.RetryTime = emailMessageRetryTime;
			newEmailMessage.MaximumRetry = emailMessageMaximumRetry;
			newEmailMessage.ExpiryDatetime = emailMessageExpiryDatetime;
			newEmailMessage.ArrivedDateTime = emailMessageArrivedDateTime;
			newEmailMessage.SenderInfo = emailMessageSenderInfo;
			newEmailMessage.EmailTo = emailMessageEmailTo;
			newEmailMessage.EmailFrom = emailMessageEmailFrom;
			newEmailMessage.EmailSubject = emailMessageEmailSubject;
			newEmailMessage.EmailBody = emailMessageEmailBody;
			newEmailMessage.EmailCC = emailMessageEmailCC;
			newEmailMessage.EmailBCC = emailMessageEmailBCC;
			newEmailMessage.IsHtml = emailMessageIsHtml;
			return newEmailMessage;
		}
				
		#endregion Constructors
		
		
		#region Events trigger
		/// <summary>
		/// Raises the <see cref="ColumnChanging" /> event.
		/// </summary>
		/// <param name="column">The <see cref="EmailMessageColumn"/> which has raised the event.</param>
		public void OnColumnChanging(EmailMessageColumn column)
		{
			if(IsEntityTracked && EntityState != EntityState.Added)
				EntityManager.StopTracking(EntityTrackingKey);
				
			if (!SuppressEntityEvents)
			{
				EmailMessageEventHandler handler = ColumnChanging;
				if(handler != null)
				{
					handler(this, new EmailMessageEventArgs(column));
				}
			}
		}
		
		/// <summary>
		/// Raises the <see cref="ColumnChanged" /> event.
		/// </summary>
		/// <param name="column">The <see cref="EmailMessageColumn"/> which has raised the event.</param>
		public void OnColumnChanged(EmailMessageColumn column)
		{
			if (!SuppressEntityEvents)
			{
				EmailMessageEventHandler handler = ColumnChanged;
				if(handler != null)
				{
					handler(this, new EmailMessageEventArgs(column));
				}
			
				// warn the parent list that i have changed
				OnEntityChanged();
			}
		} 
		#endregion
				
		#region Properties	
				
		/// <summary>
		/// 	Gets or sets the ID property. 
		///		
		/// </summary>
		/// <value>This type is uniqueidentifier.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(true, false, false)]
		public override System.Guid ID
		{
			get
			{
				return this.entityData.ID; 
			}
			
			set
			{
				if (this.entityData.ID == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.ID);
				this.entityData.ID = value;
				this.EntityId.ID = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.ID);
				OnPropertyChanged("ID");
			}
		}
		
		/// <summary>
		/// 	Get the original value of the ID property.
		///		
		/// </summary>
		/// <remarks>This is the original value of the ID property.</remarks>
		/// <value>This type is uniqueidentifier</value>
		[BrowsableAttribute(false)/*, XmlIgnoreAttribute()*/]
		public  virtual System.Guid OriginalID
		{
			get { return this.entityData.OriginalID; }
			set { this.entityData.OriginalID = value; }
		}
		
		/// <summary>
		/// 	Gets or sets the ChangeStamp property. 
		///		
		/// </summary>
		/// <value>This type is datetime.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public override System.DateTime ChangeStamp
		{
			get
			{
				return this.entityData.ChangeStamp; 
			}
			
			set
			{
				if (this.entityData.ChangeStamp == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.ChangeStamp);
				this.entityData.ChangeStamp = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.ChangeStamp);
				OnPropertyChanged("ChangeStamp");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the Priority property. 
		///		
		/// </summary>
		/// <value>This type is int.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.Int32 Priority
		{
			get
			{
				return this.entityData.Priority; 
			}
			
			set
			{
				if (this.entityData.Priority == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.Priority);
				this.entityData.Priority = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.Priority);
				OnPropertyChanged("Priority");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the Status property. 
		///		
		/// </summary>
		/// <value>This type is int.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.Int32 Status
		{
			get
			{
				return this.entityData.Status; 
			}
			
			set
			{
				if (this.entityData.Status == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.Status);
				this.entityData.Status = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.Status);
				OnPropertyChanged("Status");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the NumberOfRetry property. 
		///		
		/// </summary>
		/// <value>This type is int.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.Int32 NumberOfRetry
		{
			get
			{
				return this.entityData.NumberOfRetry; 
			}
			
			set
			{
				if (this.entityData.NumberOfRetry == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.NumberOfRetry);
				this.entityData.NumberOfRetry = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.NumberOfRetry);
				OnPropertyChanged("NumberOfRetry");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the RetryTime property. 
		///		
		/// </summary>
		/// <value>This type is datetime.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.DateTime RetryTime
		{
			get
			{
				return this.entityData.RetryTime; 
			}
			
			set
			{
				if (this.entityData.RetryTime == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.RetryTime);
				this.entityData.RetryTime = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.RetryTime);
				OnPropertyChanged("RetryTime");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the MaximumRetry property. 
		///		
		/// </summary>
		/// <value>This type is int.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.Int32 MaximumRetry
		{
			get
			{
				return this.entityData.MaximumRetry; 
			}
			
			set
			{
				if (this.entityData.MaximumRetry == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.MaximumRetry);
				this.entityData.MaximumRetry = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.MaximumRetry);
				OnPropertyChanged("MaximumRetry");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the ExpiryDatetime property. 
		///		
		/// </summary>
		/// <value>This type is datetime.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.DateTime ExpiryDatetime
		{
			get
			{
				return this.entityData.ExpiryDatetime; 
			}
			
			set
			{
				if (this.entityData.ExpiryDatetime == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.ExpiryDatetime);
				this.entityData.ExpiryDatetime = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.ExpiryDatetime);
				OnPropertyChanged("ExpiryDatetime");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the ArrivedDateTime property. 
		///		
		/// </summary>
		/// <value>This type is datetime.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.DateTime ArrivedDateTime
		{
			get
			{
				return this.entityData.ArrivedDateTime; 
			}
			
			set
			{
				if (this.entityData.ArrivedDateTime == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.ArrivedDateTime);
				this.entityData.ArrivedDateTime = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.ArrivedDateTime);
				OnPropertyChanged("ArrivedDateTime");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the SenderInfo property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String SenderInfo
		{
			get
			{
				return this.entityData.SenderInfo; 
			}
			
			set
			{
				if (this.entityData.SenderInfo == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.SenderInfo);
				this.entityData.SenderInfo = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.SenderInfo);
				OnPropertyChanged("SenderInfo");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailTo property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String EmailTo
		{
			get
			{
				return this.entityData.EmailTo; 
			}
			
			set
			{
				if (this.entityData.EmailTo == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailTo);
				this.entityData.EmailTo = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailTo);
				OnPropertyChanged("EmailTo");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailFrom property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String EmailFrom
		{
			get
			{
				return this.entityData.EmailFrom; 
			}
			
			set
			{
				if (this.entityData.EmailFrom == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailFrom);
				this.entityData.EmailFrom = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailFrom);
				OnPropertyChanged("EmailFrom");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailSubject property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String EmailSubject
		{
			get
			{
				return this.entityData.EmailSubject; 
			}
			
			set
			{
				if (this.entityData.EmailSubject == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailSubject);
				this.entityData.EmailSubject = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailSubject);
				OnPropertyChanged("EmailSubject");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailBody property. 
		///		
		/// </summary>
		/// <value>This type is text.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.String EmailBody
		{
			get
			{
				return this.entityData.EmailBody; 
			}
			
			set
			{
				if (this.entityData.EmailBody == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailBody);
				this.entityData.EmailBody = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailBody);
				OnPropertyChanged("EmailBody");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailCC property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String EmailCC
		{
			get
			{
				return this.entityData.EmailCC; 
			}
			
			set
			{
				if (this.entityData.EmailCC == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailCC);
				this.entityData.EmailCC = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailCC);
				OnPropertyChanged("EmailCC");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the EmailBCC property. 
		///		
		/// </summary>
		/// <value>This type is varchar.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		/// <exception cref="ArgumentNullException">If you attempt to set to null.</exception>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false, 1000)]
		public virtual System.String EmailBCC
		{
			get
			{
				return this.entityData.EmailBCC; 
			}
			
			set
			{
				if (this.entityData.EmailBCC == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.EmailBCC);
				this.entityData.EmailBCC = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.EmailBCC);
				OnPropertyChanged("EmailBCC");
			}
		}
		
		/// <summary>
		/// 	Gets or sets the IsHtml property. 
		///		
		/// </summary>
		/// <value>This type is bit.</value>
		/// <remarks>
		/// This property can not be set to null. 
		/// </remarks>
		[DescriptionAttribute(""), BindableAttribute()]
		[DataObjectField(false, false, false)]
		public virtual System.Boolean IsHtml
		{
			get
			{
				return this.entityData.IsHtml; 
			}
			
			set
			{
				if (this.entityData.IsHtml == value)
					return;
					
					
				OnColumnChanging(EmailMessageColumn.IsHtml);
				this.entityData.IsHtml = value;
				if (this.EntityState == EntityState.Unchanged)
				{
					this.EntityState = EntityState.Changed;
				}
				OnColumnChanged(EmailMessageColumn.IsHtml);
				OnPropertyChanged("IsHtml");
			}
		}
		

		#region Source Foreign Key Property
				
		#endregion
			
		#region Table Meta Data
		/// <summary>
		///		The name of the underlying database table.
		/// </summary>
		[BrowsableAttribute(false), XmlIgnoreAttribute()]
		public override string TableName
		{
			get { return "EmailMessage"; }
		}
		
		/// <summary>
		///		The name of the underlying database table's columns.
		/// </summary>
		[BrowsableAttribute(false), XmlIgnoreAttribute()]
		public override string[] TableColumns
		{
			get
			{
				return new string[] {"ID", "ChangeStamp", "Priority", "Status", "NumberOfRetry", "RetryTime", "MaximumRetry", "ExpiryDatetime", "ArrivedDateTime", "SenderInfo", "EmailTo", "EmailFrom", "EmailSubject", "EmailBody", "EmailCC", "EmailBCC", "IsHtml"};
			}
		}
		#endregion 
		
	
		/// <summary>
		///	Holds a collection of EmailMessageDetail objects
		///	which are related to this object through the relation FK_EmailMessageDetail_EmailMessage
		/// </summary>	
		[BindableAttribute()]
		public TList<EmailMessageDetail> EmailMessageDetailCollection
		{
			get { return entityData.EmailMessageDetailCollection; }
			set { entityData.EmailMessageDetailCollection = value; }	
		}
		
		#endregion
		
		#region IEditableObject
		
		#region  CancelAddNew Event
		/// <summary>
        /// The delegate for the CancelAddNew event.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		public delegate void CancelAddNewEventHandler(object sender, EventArgs e);
    
    	/// <summary>
		/// The CancelAddNew event.
		/// </summary>
		[field:NonSerialized]
		public event CancelAddNewEventHandler CancelAddNew ;

		/// <summary>
        /// Called when [cancel add new].
        /// </summary>
        public void OnCancelAddNew()
        {    
			if (!SuppressEntityEvents)
			{
	            CancelAddNewEventHandler handler = CancelAddNew ;
            	if (handler != null)
	            {    
    	            handler(this, EventArgs.Empty) ;
        	    }
	        }
        }
		#endregion 
		
		/// <summary>
		/// Begins an edit on an object.
		/// </summary>
		void IEditableObject.BeginEdit() 
	    {
	        //Console.WriteLine("Start BeginEdit");
	        if (!inTxn) 
	        {
	            this.backupData = this.entityData.Clone() as EmailMessageEntityData;
	            inTxn = true;
	            //Console.WriteLine("BeginEdit");
	        }
	        //Console.WriteLine("End BeginEdit");
	    }
	
		/// <summary>
		/// Discards changes since the last <c>BeginEdit</c> call.
		/// </summary>
	    void IEditableObject.CancelEdit() 
	    {
	        //Console.WriteLine("Start CancelEdit");
	        if (this.inTxn) 
	        {
	            this.entityData = this.backupData;
	            this.backupData = null;
				this.inTxn = false;

				if (this.bindingIsNew)
	        	//if (this.EntityState == EntityState.Added)
	        	{
					if (this.parentCollection != null)
						this.parentCollection.Remove( (EmailMessage) this ) ;
				}	            
	        }
	        //Console.WriteLine("End CancelEdit");
	    }
	
		/// <summary>
		/// Pushes changes since the last <c>BeginEdit</c> or <c>IBindingList.AddNew</c> call into the underlying object.
		/// </summary>
	    void IEditableObject.EndEdit() 
	    {
	        //Console.WriteLine("Start EndEdit" + this.custData.id + this.custData.lastName);
	        if (this.inTxn) 
	        {
	            this.backupData = null;
				if (this.IsDirty) 
				{
					if (this.bindingIsNew) {
						this.EntityState = EntityState.Added;
						this.bindingIsNew = false ;
					}
					else
						if (this.EntityState == EntityState.Unchanged) 
							this.EntityState = EntityState.Changed ;
				}

				this.bindingIsNew = false ;
	            this.inTxn = false;	            
	        }
	        //Console.WriteLine("End EndEdit");
	    }
	    
	    /// <summary>
        /// Gets or sets the parent collection.
        /// </summary>
        /// <value>The parent collection.</value>
	    [XmlIgnore]
		[Browsable(false)]
	    public override object ParentCollection
	    {
	        get 
	        {
	            return (object)this.parentCollection;
	        }
	        set 
	        {
	            this.parentCollection = value as TList<EmailMessage>;
	        }
	    }
	    
	    /// <summary>
        /// Called when the entity is changed.
        /// </summary>
	    private void OnEntityChanged() 
	    {
	        if (!SuppressEntityEvents && !inTxn && this.parentCollection != null) 
	        {
	            this.parentCollection.EntityChanged(this as EmailMessage);
	        }
	    }


		#endregion
		
		#region Methods	
			
		///<summary>
		///  TODO: Revert all changes and restore original values.
		///  Currently not supported.
		///</summary>
		/// <exception cref="NotSupportedException">This method is not currently supported and always throws this exception.</exception>
		public override void CancelChanges()
		{
			throw new NotImplementedException("Method currently not Supported.");
		}	
		
		#region ICloneable Members
		///<summary>
		///  Returns a Typed EmailMessage Entity 
		///</summary>
		public virtual EmailMessage Copy()
		{
			//shallow copy entity
			EmailMessage copy = new EmailMessage();
			copy.ID = this.ID;
			copy.OriginalID = this.OriginalID;
			copy.ChangeStamp = this.ChangeStamp;
			copy.Priority = this.Priority;
			copy.Status = this.Status;
			copy.NumberOfRetry = this.NumberOfRetry;
			copy.RetryTime = this.RetryTime;
			copy.MaximumRetry = this.MaximumRetry;
			copy.ExpiryDatetime = this.ExpiryDatetime;
			copy.ArrivedDateTime = this.ArrivedDateTime;
			copy.SenderInfo = this.SenderInfo;
			copy.EmailTo = this.EmailTo;
			copy.EmailFrom = this.EmailFrom;
			copy.EmailSubject = this.EmailSubject;
			copy.EmailBody = this.EmailBody;
			copy.EmailCC = this.EmailCC;
			copy.EmailBCC = this.EmailBCC;
			copy.IsHtml = this.IsHtml;
					
			copy.AcceptChanges();
			return (EmailMessage)copy;
		}
		
		///<summary>
		/// ICloneable.Clone() Member, returns the Shallow Copy of this entity.
		///</summary>
		public object Clone()
		{
			return this.Copy();
		}
		
		///<summary>
		/// Returns a deep copy of the child collection object passed in.
		///</summary>
		public static object MakeCopyOf(object x)
		{
			if (x is ICloneable)
			{
				// Return a deep copy of the object
				return ((ICloneable)x).Clone();
			}
			else
				throw new System.NotSupportedException("Object Does Not Implement the ICloneable Interface.");
		}
		
		///<summary>
		///  Returns a Typed EmailMessage Entity which is a deep copy of the current entity.
		///</summary>
		public virtual EmailMessage DeepCopy()
		{
			return EntityHelper.Clone<EmailMessage>(this as EmailMessage);	
		}
		#endregion
		
		///<summary>
		/// Returns a value indicating whether this instance is equal to a specified object.
		///</summary>
		///<param name="toObject">An object to compare to this instance.</param>
		///<returns>true if toObject is a <see cref="EmailMessageBase"/> and has the same value as this instance; otherwise, false.</returns>
		public virtual bool Equals(EmailMessageBase toObject)
		{
			if (toObject == null)
				return false;
			return Equals(this, toObject);
		}
		
		
		///<summary>
		/// Determines whether the specified <see cref="EmailMessageBase"/> instances are considered equal.
		///</summary>
		///<param name="Object1">The first <see cref="EmailMessageBase"/> to compare.</param>
		///<param name="Object2">The second <see cref="EmailMessageBase"/> to compare. </param>
		///<returns>true if Object1 is the same instance as Object2 or if both are null references or if objA.Equals(objB) returns true; otherwise, false.</returns>
		public static bool Equals(EmailMessageBase Object1, EmailMessageBase Object2)
		{
			// both are null
			if (Object1 == null && Object2 == null)
				return true;

			// one or the other is null, but not both
			if (Object1 == null ^ Object2 == null)
				return false;
				
			bool equal = true;
			if (Object1.ID != Object2.ID)
				equal = false;
			if (Object1.ChangeStamp != Object2.ChangeStamp)
				equal = false;
			if (Object1.Priority != Object2.Priority)
				equal = false;
			if (Object1.Status != Object2.Status)
				equal = false;
			if (Object1.NumberOfRetry != Object2.NumberOfRetry)
				equal = false;
			if (Object1.RetryTime != Object2.RetryTime)
				equal = false;
			if (Object1.MaximumRetry != Object2.MaximumRetry)
				equal = false;
			if (Object1.ExpiryDatetime != Object2.ExpiryDatetime)
				equal = false;
			if (Object1.ArrivedDateTime != Object2.ArrivedDateTime)
				equal = false;
			if (Object1.SenderInfo != Object2.SenderInfo)
				equal = false;
			if (Object1.EmailTo != Object2.EmailTo)
				equal = false;
			if (Object1.EmailFrom != Object2.EmailFrom)
				equal = false;
			if (Object1.EmailSubject != Object2.EmailSubject)
				equal = false;
			if (Object1.EmailBody != Object2.EmailBody)
				equal = false;
			if (Object1.EmailCC != Object2.EmailCC)
				equal = false;
			if (Object1.EmailBCC != Object2.EmailBCC)
				equal = false;
			if (Object1.IsHtml != Object2.IsHtml)
				equal = false;
			return equal;
		}
		
		#endregion
		
		#region IComparable Members
		///<summary>
		/// Compares this instance to a specified object and returns an indication of their relative values.
		///<param name="obj">An object to compare to this instance, or a null reference (Nothing in Visual Basic).</param>
		///</summary>
		///<returns>A signed integer that indicates the relative order of this instance and obj.</returns>
		public virtual int CompareTo(object obj)
		{
			throw new NotImplementedException();
			// TODO -> generate a strongly typed IComparer in the concrete class
			//return this. GetPropertyName(SourceTable.PrimaryKey.MemberColumns[0].Name) .CompareTo(((EmailMessageBase)obj).GetPropertyName(SourceTable.PrimaryKey.MemberColumns[0].Name));
		}
		
		/*
		// static method to get a Comparer object
        public static EmailMessageComparer GetComparer()
        {
            return new EmailMessageComparer();
        }
        */

        // Comparer delegates back to EmailMessage
        // Employee uses the integer's default
        // CompareTo method
        /*
        public int CompareTo(Item rhs)
        {
            return this.Id.CompareTo(rhs.Id);
        }
        */

/*
        // Special implementation to be called by custom comparer
        public int CompareTo(EmailMessage rhs, EmailMessageColumn which)
        {
            switch (which)
            {
            	
            	
            	case EmailMessageColumn.ID:
            		return this.ID.CompareTo(rhs.ID);
            		
            		                 
            	
            	
            	case EmailMessageColumn.ChangeStamp:
            		return this.ChangeStamp.CompareTo(rhs.ChangeStamp);
            		
            		                 
            	
            	
            	case EmailMessageColumn.Priority:
            		return this.Priority.CompareTo(rhs.Priority);
            		
            		                 
            	
            	
            	case EmailMessageColumn.Status:
            		return this.Status.CompareTo(rhs.Status);
            		
            		                 
            	
            	
            	case EmailMessageColumn.NumberOfRetry:
            		return this.NumberOfRetry.CompareTo(rhs.NumberOfRetry);
            		
            		                 
            	
            	
            	case EmailMessageColumn.RetryTime:
            		return this.RetryTime.CompareTo(rhs.RetryTime);
            		
            		                 
            	
            	
            	case EmailMessageColumn.MaximumRetry:
            		return this.MaximumRetry.CompareTo(rhs.MaximumRetry);
            		
            		                 
            	
            	
            	case EmailMessageColumn.ExpiryDatetime:
            		return this.ExpiryDatetime.CompareTo(rhs.ExpiryDatetime);
            		
            		                 
            	
            	
            	case EmailMessageColumn.ArrivedDateTime:
            		return this.ArrivedDateTime.CompareTo(rhs.ArrivedDateTime);
            		
            		                 
            	
            	
            	case EmailMessageColumn.SenderInfo:
            		return this.SenderInfo.CompareTo(rhs.SenderInfo);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailTo:
            		return this.EmailTo.CompareTo(rhs.EmailTo);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailFrom:
            		return this.EmailFrom.CompareTo(rhs.EmailFrom);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailSubject:
            		return this.EmailSubject.CompareTo(rhs.EmailSubject);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailBody:
            		return this.EmailBody.CompareTo(rhs.EmailBody);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailCC:
            		return this.EmailCC.CompareTo(rhs.EmailCC);
            		
            		                 
            	
            	
            	case EmailMessageColumn.EmailBCC:
            		return this.EmailBCC.CompareTo(rhs.EmailBCC);
            		
            		                 
            	
            	
            	case EmailMessageColumn.IsHtml:
            		return this.IsHtml.CompareTo(rhs.IsHtml);
            		
            		                 
            }
            return 0;
        }
        */
	
		#endregion
		
		#region IComponent Members
		
		private ISite _site = null;

		/// <summary>
		/// Gets or Sets the site where this data is located.
		/// </summary>
		[XmlIgnore]
		[SoapIgnore]
		[Browsable(false)]
		public ISite Site
		{
			get{ return this._site; }
			set{ this._site = value; }
		}

		#endregion

		#region IDisposable Members
		
		/// <summary>
		/// Notify those that care when we dispose.
		/// </summary>
		[field:NonSerialized]
		public event System.EventHandler Disposed;

		/// <summary>
		/// Clean up. Nothing here though.
		/// </summary>
		public void Dispose()
		{
			this.parentCollection = null;
			this.Dispose(true);
			GC.SuppressFinalize(this);
		}
		
		/// <summary>
		/// Clean up.
		/// </summary>
		protected virtual void Dispose(bool disposing)
		{
			if (disposing)
			{
				EventHandler handler = Disposed;
				if (handler != null)
					handler(this, EventArgs.Empty);
			}
		}
		
		#endregion
				
		#region IEntityKey<EmailMessageKey> Members
		
		// member variable for the EntityId property
		private EmailMessageKey _entityId;

		/// <summary>
		/// Gets or sets the EntityId property.
		/// </summary>
		[XmlIgnore]
		public EmailMessageKey EntityId
		{
			get
			{
				if ( _entityId == null )
				{
					_entityId = new EmailMessageKey(this);
				}

				return _entityId;
			}
			set
			{
				if ( value != null )
				{
					value.Entity = this;
				}
				
				_entityId = value;
			}
		}
		
		#endregion
		
		#region EntityTrackingKey
		///<summary>
		/// Provides the tracking key for the <see cref="EntityLocator"/>
		///</summary>
		[XmlIgnore]
		public override string EntityTrackingKey
		{
			get
			{
				if(entityTrackingKey == null)
					entityTrackingKey = @"EmailMessage" 
					+ this.ID.ToString();
				return entityTrackingKey;
			}
			set
		    {
		        if (value != null)
                    entityTrackingKey = value;
		    }
		}
		#endregion 
		
		#region ToString Method
		
		///<summary>
		/// Returns a String that represents the current object.
		///</summary>
		public override string ToString()
		{
			return string.Format(System.Globalization.CultureInfo.InvariantCulture,
				"{18}{17}- ID: {0}{17}- ChangeStamp: {1}{17}- Priority: {2}{17}- Status: {3}{17}- NumberOfRetry: {4}{17}- RetryTime: {5}{17}- MaximumRetry: {6}{17}- ExpiryDatetime: {7}{17}- ArrivedDateTime: {8}{17}- SenderInfo: {9}{17}- EmailTo: {10}{17}- EmailFrom: {11}{17}- EmailSubject: {12}{17}- EmailBody: {13}{17}- EmailCC: {14}{17}- EmailBCC: {15}{17}- IsHtml: {16}{17}", 
				this.ID,
				this.ChangeStamp,
				this.Priority,
				this.Status,
				this.NumberOfRetry,
				this.RetryTime,
				this.MaximumRetry,
				this.ExpiryDatetime,
				this.ArrivedDateTime,
				this.SenderInfo,
				this.EmailTo,
				this.EmailFrom,
				this.EmailSubject,
				this.EmailBody,
				this.EmailCC,
				this.EmailBCC,
				this.IsHtml,
				Environment.NewLine, 
				this.GetType());
		}
		
		#endregion ToString Method
		
		#region Inner data class
		
	/// <summary>
	///		The data structure representation of the 'EmailMessage' table.
	/// </summary>
	/// <remarks>
	/// 	This struct is generated by a tool and should never be modified.
	/// </remarks>
	[EditorBrowsable(EditorBrowsableState.Never)]
	[Serializable]
	internal class EmailMessageEntityData : ICloneable
	{
		#region Variable Declarations
		
		#region Primary key(s)
			/// <summary>			
			/// ID : 
			/// </summary>
			/// <remarks>Member of the primary key of the underlying table "EmailMessage"</remarks>
			public System.Guid ID;
				
			/// <summary>
			/// keep a copy of the original so it can be used for editable primary keys.
			/// </summary>
			public System.Guid OriginalID;
			
		#endregion
		
		#region Non Primary key(s)
		
		
		/// <summary>
		/// ChangeStamp : 
		/// </summary>
		public System.DateTime		  ChangeStamp = DateTime.MinValue;
		
		/// <summary>
		/// Priority : 
		/// </summary>
		public System.Int32		  Priority = (int)0;
		
		/// <summary>
		/// Status : 
		/// </summary>
		public System.Int32		  Status = (int)0;
		
		/// <summary>
		/// NumberOfRetry : 
		/// </summary>
		public System.Int32		  NumberOfRetry = (int)0;
		
		/// <summary>
		/// RetryTime : 
		/// </summary>
		public System.DateTime		  RetryTime = DateTime.MinValue;
		
		/// <summary>
		/// MaximumRetry : 
		/// </summary>
		public System.Int32		  MaximumRetry = (int)0;
		
		/// <summary>
		/// ExpiryDatetime : 
		/// </summary>
		public System.DateTime		  ExpiryDatetime = DateTime.MinValue;
		
		/// <summary>
		/// ArrivedDateTime : 
		/// </summary>
		public System.DateTime		  ArrivedDateTime = DateTime.MinValue;
		
		/// <summary>
		/// SenderInfo : 
		/// </summary>
		public System.String		  SenderInfo = string.Empty;
		
		/// <summary>
		/// EmailTo : 
		/// </summary>
		public System.String		  EmailTo = string.Empty;
		
		/// <summary>
		/// EmailFrom : 
		/// </summary>
		public System.String		  EmailFrom = string.Empty;
		
		/// <summary>
		/// EmailSubject : 
		/// </summary>
		public System.String		  EmailSubject = string.Empty;
		
		/// <summary>
		/// EmailBody : 
		/// </summary>
		public System.String		  EmailBody = string.Empty;
		
		/// <summary>
		/// EmailCC : 
		/// </summary>
		public System.String		  EmailCC = string.Empty;
		
		/// <summary>
		/// EmailBCC : 
		/// </summary>
		public System.String		  EmailBCC = string.Empty;
		
		/// <summary>
		/// IsHtml : 
		/// </summary>
		public System.Boolean		  IsHtml = false;
		#endregion
			
		#endregion "Variable Declarations"
		
		public Object Clone()
		{
			EmailMessageEntityData _tmp = new EmailMessageEntityData();
						
			_tmp.ID = this.ID;
			_tmp.OriginalID = this.OriginalID;
			
			_tmp.ChangeStamp = this.ChangeStamp;
			_tmp.Priority = this.Priority;
			_tmp.Status = this.Status;
			_tmp.NumberOfRetry = this.NumberOfRetry;
			_tmp.RetryTime = this.RetryTime;
			_tmp.MaximumRetry = this.MaximumRetry;
			_tmp.ExpiryDatetime = this.ExpiryDatetime;
			_tmp.ArrivedDateTime = this.ArrivedDateTime;
			_tmp.SenderInfo = this.SenderInfo;
			_tmp.EmailTo = this.EmailTo;
			_tmp.EmailFrom = this.EmailFrom;
			_tmp.EmailSubject = this.EmailSubject;
			_tmp.EmailBody = this.EmailBody;
			_tmp.EmailCC = this.EmailCC;
			_tmp.EmailBCC = this.EmailBCC;
			_tmp.IsHtml = this.IsHtml;
			
			return _tmp;
		}
		

	  private TList<EmailMessageDetail> emailMessageDetail;
      public TList<EmailMessageDetail> EmailMessageDetailCollection
      {
         get
         {
            if (emailMessageDetail == null)
            {
               emailMessageDetail = new TList<EmailMessageDetail>();
            }

            return emailMessageDetail;
         }
         set { emailMessageDetail = value; }
      }
	}//End struct


		#endregion
		
		#region Validation
		
		/// <summary>
		/// Assigns validation rules to this object based on model definition.
		/// </summary>
		/// <remarks>This method overrides the base class to add schema related validation.</remarks>
		protected override void AddValidationRules()
		{
			//Validation rules based on database schema.
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"SenderInfo");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("SenderInfo",1000));
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailTo");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("EmailTo",1000));
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailFrom");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("EmailFrom",1000));
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailSubject");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("EmailSubject",1000));
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailBody");
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailCC");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("EmailCC",1000));
			ValidationRules.AddRule(Validation.CommonRules.NotNull,"EmailBCC");
			ValidationRules.AddRule(Validation.CommonRules.StringMaxLength,new Validation.CommonRules.MaxLengthRuleArgs("EmailBCC",1000));
		}
   		#endregion
	
	} // End Class
	
	#region EmailMessageComparer
		
	/// <summary>
	///	Strongly Typed IComparer
	/// </summary>
	public class EmailMessageComparer : System.Collections.Generic.IComparer<EmailMessage>
	{
		EmailMessageColumn whichComparison;
		
		/// <summary>
        /// Initializes a new instance of the <see cref="T:EmailMessageComparer"/> class.
        /// </summary>
		public EmailMessageComparer()
        {            
        }               
        
        /// <summary>
        /// Initializes a new instance of the <see cref="T:%=className%>Comparer"/> class.
        /// </summary>
        /// <param name="column">The column to sort on.</param>
        public EmailMessageComparer(EmailMessageColumn column)
        {
            this.whichComparison = column;
        }

		/// <summary>
        /// Determines whether the specified <c cref="EmailMessage"/> instances are considered equal.
        /// </summary>
        /// <param name="a">The first <c cref="EmailMessage"/> to compare.</param>
        /// <param name="b">The second <c>EmailMessage</c> to compare.</param>
        /// <returns>true if objA is the same instance as objB or if both are null references or if objA.Equals(objB) returns true; otherwise, false.</returns>
        public bool Equals(EmailMessage a, EmailMessage b)
        {
            return this.Compare(a, b) == 0;
        }

		/// <summary>
        /// Gets the hash code of the specified entity.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <returns></returns>
        public int GetHashCode(EmailMessage entity)
        {
            return entity.GetHashCode();
        }

        /// <summary>
        /// Performs a case-insensitive comparison of two objects of the same type and returns a value indicating whether one is less than, equal to, or greater than the other.
        /// </summary>
        /// <param name="a">The first object to compare.</param>
        /// <param name="b">The second object to compare.</param>
        /// <returns></returns>
        public int Compare(EmailMessage a, EmailMessage b)
        {
        	EntityPropertyComparer entityPropertyComparer = new EntityPropertyComparer(this.whichComparison.ToString());
        	return entityPropertyComparer.Compare(a, b);
        }

		/// <summary>
        /// Gets or sets the column that will be used for comparison.
        /// </summary>
        /// <value>The comparison column.</value>
        public EmailMessageColumn WhichComparison
        {
            get { return this.whichComparison; }
            set { this.whichComparison = value; }
        }
	}
	
	#endregion
	
	#region EmailMessageKey Class

	/// <summary>
	/// Wraps the unique identifier values for the <see cref="EmailMessage"/> object.
	/// </summary>
	[Serializable]
	[CLSCompliant(true)]
	public class EmailMessageKey : EntityKeyBase
	{
		#region Constructors
		
		/// <summary>
		/// Initializes a new instance of the EmailMessageKey class.
		/// </summary>
		public EmailMessageKey()
		{
		}
		
		/// <summary>
		/// Initializes a new instance of the EmailMessageKey class.
		/// </summary>
		public EmailMessageKey(EmailMessageBase entity)
		{
			Entity = entity;

			#region Init Properties

			if ( entity != null )
			{
				this.id = entity.ID;
			}

			#endregion
		}
		
		/// <summary>
		/// Initializes a new instance of the EmailMessageKey class.
		/// </summary>
		public EmailMessageKey(System.Guid id)
		{
			#region Init Properties

			this.id = id;

			#endregion
		}
		
		#endregion Constructors

		#region Properties
		
		// member variable for the Entity property
		private EmailMessageBase _entity;
		
		/// <summary>
		/// Gets or sets the Entity property.
		/// </summary>
		public EmailMessageBase Entity
		{
			get { return _entity; }
			set { _entity = value; }
		}
		
		// member variable for the ID property
		private System.Guid id;
		
		/// <summary>
		/// Gets or sets the ID property.
		/// </summary>
		public System.Guid ID
		{
			get { return id; }
			set
			{
				if ( Entity != null )
				{
					Entity.ID = value;
				}
				
				id = value;
			}
		}
		
		#endregion

		#region Methods
		
		/// <summary>
		/// Reads values from the supplied <see cref="IDictionary"/> object into
		/// properties of the current object.
		/// </summary>
		/// <param name="values">An <see cref="IDictionary"/> instance that contains
		/// the key/value pairs to be used as property values.</param>
		public override void Load(IDictionary values)
		{
			#region Init Properties

			if ( values != null )
			{
				ID = ( values["ID"] != null ) ? (System.Guid) EntityUtil.ChangeType(values["ID"], typeof(System.Guid)) : Guid.Empty;
			}

			#endregion
		}

		/// <summary>
		/// Creates a new <see cref="IDictionary"/> object and populates it
		/// with the property values of the current object.
		/// </summary>
		/// <returns>A collection of name/value pairs.</returns>
		public override IDictionary ToDictionary()
		{
			IDictionary values = new Hashtable();

			#region Init Dictionary

			values.Add("ID", ID);

			#endregion Init Dictionary

			return values;
		}
		
		///<summary>
		/// Returns a String that represents the current object.
		///</summary>
		public override string ToString()
		{
			return String.Format("ID: {0}{1}",
								ID,
								Environment.NewLine);
		}

		#endregion Methods
	}
	
	#endregion	

	#region EmailMessageColumn Enum
	
	/// <summary>
	/// Enumerate the EmailMessage columns.
	/// </summary>
	[Serializable]
	public enum EmailMessageColumn
	{
		/// <summary>
		/// ID : 
		/// </summary>
		[EnumTextValue("ID")]
		[ColumnEnum("ID", typeof(System.Guid), System.Data.DbType.Guid, true, false, false)]
		ID,
		/// <summary>
		/// ChangeStamp : 
		/// </summary>
		[EnumTextValue("ChangeStamp")]
		[ColumnEnum("ChangeStamp", typeof(System.DateTime), System.Data.DbType.DateTime, false, false, false)]
		ChangeStamp,
		/// <summary>
		/// Priority : 
		/// </summary>
		[EnumTextValue("Priority")]
		[ColumnEnum("Priority", typeof(System.Int32), System.Data.DbType.Int32, false, false, false)]
		Priority,
		/// <summary>
		/// Status : 
		/// </summary>
		[EnumTextValue("Status")]
		[ColumnEnum("Status", typeof(System.Int32), System.Data.DbType.Int32, false, false, false)]
		Status,
		/// <summary>
		/// NumberOfRetry : 
		/// </summary>
		[EnumTextValue("NumberOfRetry")]
		[ColumnEnum("NumberOfRetry", typeof(System.Int32), System.Data.DbType.Int32, false, false, false)]
		NumberOfRetry,
		/// <summary>
		/// RetryTime : 
		/// </summary>
		[EnumTextValue("RetryTime")]
		[ColumnEnum("RetryTime", typeof(System.DateTime), System.Data.DbType.DateTime, false, false, false)]
		RetryTime,
		/// <summary>
		/// MaximumRetry : 
		/// </summary>
		[EnumTextValue("MaximumRetry")]
		[ColumnEnum("MaximumRetry", typeof(System.Int32), System.Data.DbType.Int32, false, false, false)]
		MaximumRetry,
		/// <summary>
		/// ExpiryDatetime : 
		/// </summary>
		[EnumTextValue("ExpiryDatetime")]
		[ColumnEnum("ExpiryDatetime", typeof(System.DateTime), System.Data.DbType.DateTime, false, false, false)]
		ExpiryDatetime,
		/// <summary>
		/// ArrivedDateTime : 
		/// </summary>
		[EnumTextValue("ArrivedDateTime")]
		[ColumnEnum("ArrivedDateTime", typeof(System.DateTime), System.Data.DbType.DateTime, false, false, false)]
		ArrivedDateTime,
		/// <summary>
		/// SenderInfo : 
		/// </summary>
		[EnumTextValue("SenderInfo")]
		[ColumnEnum("SenderInfo", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		SenderInfo,
		/// <summary>
		/// EmailTo : 
		/// </summary>
		[EnumTextValue("EmailTo")]
		[ColumnEnum("EmailTo", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		EmailTo,
		/// <summary>
		/// EmailFrom : 
		/// </summary>
		[EnumTextValue("EmailFrom")]
		[ColumnEnum("EmailFrom", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		EmailFrom,
		/// <summary>
		/// EmailSubject : 
		/// </summary>
		[EnumTextValue("EmailSubject")]
		[ColumnEnum("EmailSubject", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		EmailSubject,
		/// <summary>
		/// EmailBody : 
		/// </summary>
		[EnumTextValue("EmailBody")]
		[ColumnEnum("EmailBody", typeof(System.String), System.Data.DbType.AnsiString, false, false, false)]
		EmailBody,
		/// <summary>
		/// EmailCC : 
		/// </summary>
		[EnumTextValue("EmailCC")]
		[ColumnEnum("EmailCC", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		EmailCC,
		/// <summary>
		/// EmailBCC : 
		/// </summary>
		[EnumTextValue("EmailBCC")]
		[ColumnEnum("EmailBCC", typeof(System.String), System.Data.DbType.AnsiString, false, false, false, 1000)]
		EmailBCC,
		/// <summary>
		/// IsHtml : 
		/// </summary>
		[EnumTextValue("IsHtml")]
		[ColumnEnum("IsHtml", typeof(System.Boolean), System.Data.DbType.Boolean, false, false, false)]
		IsHtml
	}//End enum

	#endregion EmailMessageColumn Enum

} // end namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Australia Australia
I have been awarded MVP (Visual C#) for year 2007, 2008, 2009. I am a Microsoft Certified Application Developer (C# .Net). I currently live in Melbourne, Australia. I am a co-founder and core developer of Pageflakes www.pageflakes.com and Founder of Simplexhub, a highly experienced software development company based in Melbourne Australia and Dhaka, Bangladesh. Simplexhub.
My BLOG http://www.geekswithblogs.net/shahed
http://msmvps.com/blogs/shahed/Default.aspx.

Comments and Discussions