zhaolei
3 days ago 4a2e5b9a21940f11757be37d99f0944e240e908b
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
using System;
using System.Linq;
using System.Reflection;
 
namespace PetaPoco
{
    /// <summary>
    ///     Use by IMapper to override table bindings for an object
    /// </summary>
    public class TableInfo
    {
        /// <summary>
        ///     The database table name
        /// </summary>
        public string TableName { get; set; }
 
        /// <summary>
        ///     The name of the primary key column of the table
        /// </summary>
        public string PrimaryKey { get; set; }
 
        /// <summary>
        ///     True if the primary key column is an auto-incrementing
        /// </summary>
        public bool AutoIncrement { get; set; }
 
        /// <summary>
        ///     The name of the sequence used for auto-incrementing Oracle primary key fields
        /// </summary>
        public string SequenceName { get; set; }
 
        /// <summary>
        ///     Creates and populates a TableInfo from the attributes of a POCO
        /// </summary>
        /// <param name="t">The POCO type</param>
        /// <returns>A TableInfo instance</returns>
        public static TableInfo FromPoco(Type t)
        {
            var ti = new TableInfo();
            PopulateTableNameFromPoco(t, ref ti, out _);
            PopulatePrimaryKeyFromPoco(t, ref ti, out _, out _);
            return ti;
        }
 
 
        internal static void PopulateTableNameFromPoco(Type t, ref TableInfo ti, out TableNameAttribute tblAttr)
        {
            ti = ti ?? new TableInfo();
            tblAttr = t.GetCustomAttributes(typeof(TableNameAttribute), true).FirstOrDefault() as TableNameAttribute;
            ti.TableName = tblAttr?.Value ?? t.Name;
        }
 
        internal static void PopulatePrimaryKeyFromPoco(Type t, ref TableInfo ti, out PrimaryKeyAttribute pkAttr, out PropertyInfo idProp)
        {
            ti = ti ?? new TableInfo();
            pkAttr = t.GetCustomAttributes(typeof(PrimaryKeyAttribute), true).FirstOrDefault() as PrimaryKeyAttribute;
            idProp = null;
 
            ti.PrimaryKey = pkAttr?.Value;
            ti.SequenceName = pkAttr?.SequenceName;
            ti.AutoIncrement = pkAttr?.AutoIncrement ?? false;
            
            if (String.IsNullOrWhiteSpace(ti.PrimaryKey))
            {
                bool isIdProp(PropertyInfo p)
                {
                    bool hasName(string name) => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase);
                    return hasName("id")
                        || hasName(t.Name + "id")
                        || hasName(t.Name + "_id");
                }
 
                idProp = t.GetProperties().FirstOrDefault(isIdProp) as PropertyInfo;
                if (idProp != null)
                {
                    ti.PrimaryKey = idProp.Name;
                    ti.AutoIncrement = idProp.PropertyType.IsValueType;
                }
            }
        }
    }
}