Repository navigation
Expand file tree
/
Copy pathPropertyMap.cs
More file actions
149 lines (129 loc) · 4.42 KB
/
Copy pathPropertyMap.cs
File metadata and controls
149 lines (129 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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 (Ignored)
{
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
}
}