Cosmos/Resources/Dependencies/DapperExtensions.StrongName/Mapper/PropertyMap.cs

149 lines
No EOL
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace DapperExtensions.Mapper
{
/// <summary>
/// Maps an entity property to its corresponding column in the database.
/// </summary>
public interface IPropertyMap
{
string Name { get; }
string ColumnName { get; }
bool Ignored { get; }
bool IsReadOnly { get; }
KeyType KeyType { get; }
PropertyInfo PropertyInfo { get; }
}
/// <summary>
/// Maps an entity property to its corresponding column in the database.
/// </summary>
public class PropertyMap : IPropertyMap
{
public PropertyMap(PropertyInfo propertyInfo)
{
PropertyInfo = propertyInfo;
ColumnName = PropertyInfo.Name;
}
/// <summary>
/// Gets the name of the property by using the specified propertyInfo.
/// </summary>
public string Name
{
get { return PropertyInfo.Name; }
}
/// <summary>
/// Gets the column name for the current property.
/// </summary>
public string ColumnName { get; private set; }
/// <summary>
/// Gets the key type for the current property.
/// </summary>
public KeyType KeyType { get; private set; }
/// <summary>
/// Gets the ignore status of the current property. If ignored, the current property will not be included in queries.
/// </summary>
public bool Ignored { get; private set; }
/// <summary>
/// Gets the read-only status of the current property. If read-only, the current property will not be included in INSERT and UPDATE queries.
/// </summary>
public bool IsReadOnly { get; private set; }
/// <summary>
/// Gets the property info for the current property.
/// </summary>
public PropertyInfo PropertyInfo { get; private set; }
/// <summary>
/// Fluently sets the column name for the property.
/// </summary>
/// <param name="columnName">The column name as it exists in the database.</param>
public PropertyMap Column(string columnName)
{
ColumnName = columnName;
return this;
}
/// <summary>
/// Fluently sets the key type of the property.
/// </summary>
/// <param name="columnName">The column name as it exists in the database.</param>
public PropertyMap Key(KeyType keyType)
{
if (Ignored)
{
throw new ArgumentException(string.Format("'{0}' is ignored and cannot be made a key field. ", Name));
}
if (IsReadOnly)
{
throw new ArgumentException(string.Format("'{0}' is readonly and cannot be made a key field. ", Name));
}
KeyType = keyType;
return this;
}
/// <summary>
/// Fluently sets the ignore status of the property.
/// </summary>
public PropertyMap Ignore()
{
if (KeyType != KeyType.NotAKey)
{
throw new ArgumentException(string.Format("'{0}' is a key field and cannot be ignored.", Name));
}
Ignored = true;
return this;
}
/// <summary>
/// Fluently sets the read-only status of the property.
/// </summary>
public PropertyMap ReadOnly()
{
if (KeyType != KeyType.NotAKey)
{
throw new ArgumentException(string.Format("'{0}' is a key field and cannot be marked readonly.", Name));
}
IsReadOnly = true;
return this;
}
}
/// <summary>
/// Used by ClassMapper to determine which entity property represents the key.
/// </summary>
public enum KeyType
{
/// <summary>
/// The property is not a key and is not automatically managed.
/// </summary>
NotAKey,
/// <summary>
/// The property is an integery-based identity generated from the database.
/// </summary>
Identity,
/// <summary>
/// The property is a Guid identity which is automatically managed.
/// </summary>
Guid,
/// <summary>
/// The property is a key that is not automatically managed.
/// </summary>
Assigned
}
}