mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
149 lines
No EOL
4.4 KiB
C#
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
|
|
}
|
|
} |