• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / FluentCommand / 5874771988

16 Aug 2023 04:44AM UTC coverage: 43.028% (+2.5%) from 40.495%
5874771988

push

github

web-flow
Merge pull request #277 from loresoft/feature/method-injectors

Feature/method injectors

765 of 2171 branches covered (35.24%)

Branch coverage included in aggregate %.

126 of 126 new or added lines in 6 files covered. (100.0%)

2361 of 5094 relevant lines covered (46.35%)

119.69 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

72.73
/src/FluentCommand.SqlServer/Merge/DataMergeDefinition.cs
1
using System.ComponentModel;
2
using System.ComponentModel.DataAnnotations;
3
using System.ComponentModel.DataAnnotations.Schema;
4

5
using FluentCommand.Extensions;
6

7
namespace FluentCommand.Merge;
8

9
/// <summary>
10
/// Class representing a data merge definition.
11
/// </summary>
12
public class DataMergeDefinition
13
{
14
    /// <summary>
15
    /// Initializes a new instance of the <see cref="DataMergeDefinition"/> class.
16
    /// </summary>
17
    public DataMergeDefinition()
18
    {
19
        Columns = new List<DataMergeColumn>();
11✔
20
        TemporaryTable = "#Merge" + DateTime.Now.Ticks;
11✔
21
        IncludeInsert = true;
11✔
22
        IncludeUpdate = true;
11✔
23
        Mode = DataMergeMode.Auto;
11✔
24
    }
11✔
25

26
    /// <summary>
27
    /// Gets or sets the name of target table.
28
    /// </summary>
29
    /// <value>
30
    /// The name of target table.
31
    /// </value>
32
    public string TargetTable { get; set; }
33

34
    /// <summary>
35
    /// Gets or sets the name of temporary table the data will be bulk inserted into. The value will be generated if empty.
36
    /// </summary>
37
    /// <value>
38
    /// The name of the temporary table the data will be bulk inserted into.
39
    /// </value>
40
    public string TemporaryTable { get; set; }
41

42
    /// <summary>
43
    /// Gets or sets a value indicating whether to insert data not found in <see cref="TargetTable"/>. Default value is <c>true</c>.
44
    /// </summary>
45
    /// <value>
46
    ///   <c>true</c> to insert data not found; otherwise, <c>false</c>.
47
    /// </value>
48
    public bool IncludeInsert { get; set; }
49

50
    /// <summary>
51
    /// Gets or sets a value indicating whether to update data found in <see cref="TargetTable"/>. Default value is <c>true</c>.
52
    /// </summary>
53
    /// <value>
54
    ///   <c>true</c> to update data found; otherwise, <c>false</c>.
55
    /// </value>
56
    public bool IncludeUpdate { get; set; }
57

58
    /// <summary>
59
    /// Gets or sets a value indicating whether to delete data from <see cref="TargetTable"/> not found in <see cref="TemporaryTable"/>.
60
    /// </summary>
61
    /// <value>
62
    ///   <c>true</c> to delete target data not in source data; otherwise, <c>false</c>.
63
    /// </value>
64
    public bool IncludeDelete { get; set; }
65

66
    /// <summary>
67
    /// Gets or sets a value indicating whether to output the inserted or deleted values from <see cref="TargetTable"/>.
68
    /// </summary>
69
    /// <value>
70
    ///   <c>true</c> to output updated data from the target table; otherwise, <c>false</c>.
71
    /// </value>
72
    public bool IncludeOutput { get; set; }
73

74
    /// <summary>
75
    /// Gets or sets a value indicating whether to allow identity insert on the <see cref="TargetTable"/>.
76
    /// </summary>
77
    /// <value>
78
    ///   <c>true</c> to allow identity insert; otherwise, <c>false</c>.
79
    /// </value>
80
    public bool IdentityInsert { get; set; }
81

82
    /// <summary>
83
    /// Gets or sets the collection of mapped columns.
84
    /// </summary>
85
    /// <value>
86
    /// The mapped columns collection.
87
    /// </value>
88
    public List<DataMergeColumn> Columns { get; set; }
89

90
    /// <summary>
91
    /// Gets or sets the mode for how the merge will be processed.
92
    /// </summary>
93
    /// <value>
94
    /// The mode for how the merge will be processed.
95
    /// </value>
96
    /// <seealso cref="DataMergeMode"/>
97
    public DataMergeMode Mode { get; set; }
98

99
    /// <summary>
100
    /// Creates new instance of <see cref="DataMergeDefinition"/> with properties from type <typeparamref name="TEntity"/> auto mapped.
101
    /// </summary>
102
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
103
    /// <returns>A new instance of <see cref="DataMergeDefinition"/>.</returns>
104
    public static DataMergeDefinition Create<TEntity>()
105
    {
106
        var mergeDefinition = new DataMergeDefinition();
×
107
        AutoMap<TEntity>(mergeDefinition);
×
108

109
        return mergeDefinition;
×
110
    }
111

112
    /// <summary>
113
    /// Automatics the map the properties of type <typeparamref name="TEntity"/> to the specified <see cref="DataMergeDefinition"/> .
114
    /// </summary>
115
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
116
    /// <param name="mergeDefinition">The merge definition up auto map to.</param>
117
    public static void AutoMap<TEntity>(DataMergeDefinition mergeDefinition)
118
    {
119
        var entityType = typeof(TEntity);
9✔
120
        var properties = TypeDescriptor.GetProperties(entityType);
9✔
121

122

123
        var tableAttribute = Attribute.GetCustomAttribute(entityType, typeof(TableAttribute)) as TableAttribute;
9✔
124
        if (tableAttribute != null)
9✔
125
        {
126
            string targetTable = tableAttribute.Name;
9✔
127
            if (!string.IsNullOrEmpty(tableAttribute.Schema))
9✔
128
                targetTable = tableAttribute.Schema + "." + targetTable;
1✔
129

130
            mergeDefinition.TargetTable = targetTable;
9✔
131
        }
132

133
        if (string.IsNullOrEmpty(mergeDefinition.TargetTable))
9!
134
            mergeDefinition.TargetTable = entityType.Name;
×
135

136
        foreach (PropertyDescriptor p in properties)
166✔
137
        {
138
            string sourceColumn = p.Name;
74✔
139
            string targetColumn = sourceColumn;
74✔
140
            string nativeType = SqlTypeMapping.NativeType(p.PropertyType);
74✔
141

142
            var columnAttribute = p.Attributes
74✔
143
                .OfType<ColumnAttribute>()
74✔
144
                .FirstOrDefault();
74✔
145

146
            if (columnAttribute != null)
74!
147
            {
148
                if (columnAttribute.Name.HasValue())
×
149
                    targetColumn = columnAttribute.Name;
×
150
                if (columnAttribute.TypeName.HasValue())
×
151
                    nativeType = columnAttribute.TypeName;
×
152
            }
153

154
            var mergeColumn = mergeDefinition.Columns.FirstOrAdd(
74✔
155
                m => m.SourceColumn == sourceColumn,
74✔
156
                () => new DataMergeColumn { SourceColumn = sourceColumn });
74✔
157

158
            mergeColumn.TargetColumn = targetColumn;
74✔
159
            mergeColumn.NativeType = nativeType;
74✔
160

161
            var keyAttribute = p.Attributes
74✔
162
                .OfType<KeyAttribute>()
74✔
163
                .FirstOrDefault();
74✔
164

165
            if (keyAttribute != null)
74!
166
            {
167
                mergeColumn.IsKey = true;
×
168
                mergeColumn.CanUpdate = false;
×
169
            }
170

171
            var ignoreAttribute = p.Attributes
74✔
172
                .OfType<NotMappedAttribute>()
74✔
173
                .FirstOrDefault();
74✔
174

175
            if (ignoreAttribute != null)
74!
176
                mergeColumn.IsIgnored = true;
×
177
        }
178
    }
9✔
179

180
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc