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

loresoft / EntityFrameworkCore.Generator / 15303740763

28 May 2025 03:07PM UTC coverage: 54.841% (-0.2%) from 55.036%
15303740763

push

github

pwelter34
add file header support

642 of 1331 branches covered (48.23%)

Branch coverage included in aggregate %.

14 of 33 new or added lines in 14 files covered. (42.42%)

3 existing lines in 3 files now uncovered.

1873 of 3255 relevant lines covered (57.54%)

61.12 hits per line

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

60.73
/src/EntityFrameworkCore.Generator.Core/Templates/EntityClassTemplate.cs
1
using System.Linq;
2

3
using EntityFrameworkCore.Generator.Extensions;
4
using EntityFrameworkCore.Generator.Metadata.Generation;
5
using EntityFrameworkCore.Generator.Options;
6

7
using Microsoft.EntityFrameworkCore.Metadata;
8

9
namespace EntityFrameworkCore.Generator.Templates;
10

11
public class EntityClassTemplate : CodeTemplateBase
12
{
13
    private readonly Entity _entity;
14

15
    public EntityClassTemplate(Entity entity, GeneratorOptions options) : base(options)
22✔
16
    {
17
        _entity = entity;
22✔
18
    }
22✔
19

20
    public override string WriteCode()
21
    {
22
        CodeBuilder.Clear();
22✔
23

24
        if (Options.Data.Entity.Header.HasValue())
22!
NEW
25
            CodeBuilder.AppendLine(Options.Data.Entity.Header).AppendLine();
×
26

27
        CodeBuilder.AppendLine("using System;");
22✔
28
        CodeBuilder.AppendLine("using System.Collections.Generic;");
22✔
29
        CodeBuilder.AppendLine();
22✔
30

31
        CodeBuilder.Append($"namespace {_entity.EntityNamespace}");
22✔
32

33
        if (Options.Project.FileScopedNamespace)
22!
34
        {
35
            CodeBuilder.AppendLine(";");
×
36
            CodeBuilder.AppendLine();
×
37
            GenerateClass();
×
38
        }
39
        else
40
        {
41
            CodeBuilder.AppendLine();
22✔
42
            CodeBuilder.AppendLine("{");
22✔
43

44
            using (CodeBuilder.Indent())
22✔
45
            {
46
                GenerateClass();
22✔
47
            }
22✔
48

49
            CodeBuilder.AppendLine("}");
22✔
50
        }
51

52
        return CodeBuilder.ToString();
22✔
53
    }
54

55
    private void GenerateClass()
56
    {
57
        var entityClass = _entity.EntityClass.ToSafeName();
22✔
58

59
        if (Options.Data.Entity.Document)
22!
60
        {
61
            CodeBuilder.AppendLine("/// <summary>");
×
62
            CodeBuilder.AppendLine($"/// Entity class representing data for table '{_entity.TableName}'.");
×
63
            CodeBuilder.AppendLine("/// </summary>");
×
64
        }
65
        if (Options.Data.Entity.MappingAttributes)
22!
66
        {
67
            CodeBuilder.AppendLine($"[System.ComponentModel.DataAnnotations.Schema.Table(\"{_entity.TableName}\", Schema = \"{_entity.TableSchema}\")]");
×
68
        }
69
        CodeBuilder.AppendLine($"public partial class {entityClass}");
22✔
70

71
        if (_entity.EntityBaseClass.HasValue())
22!
72
        {
73
            var entityBaseClass = _entity.EntityBaseClass.ToSafeName();
×
74
            using (CodeBuilder.Indent())
×
75
                CodeBuilder.AppendLine($": {entityBaseClass}");
×
76
        }
77

78
        CodeBuilder.AppendLine("{");
22✔
79

80
        using (CodeBuilder.Indent())
22✔
81
        {
82
            GenerateConstructor();
22✔
83

84
            GenerateProperties();
22✔
85
            GenerateRelationshipProperties();
22✔
86
        }
22✔
87

88
        CodeBuilder.AppendLine("}");
22✔
89

90
    }
22✔
91

92
    private void GenerateConstructor()
93
    {
94
        var relationships = _entity.Relationships
22✔
95
            .Where(r => r.Cardinality == Cardinality.Many)
28✔
96
            .OrderBy(r => r.PropertyName)
12✔
97
            .ToList();
22✔
98

99
        var entityClass = _entity.EntityClass.ToSafeName();
22✔
100

101
        if (Options.Data.Entity.Document)
22!
102
        {
103
            CodeBuilder.AppendLine("/// <summary>");
×
104
            CodeBuilder.AppendLine($"/// Initializes a new instance of the <see cref=\"{entityClass}\"/> class.");
×
105
            CodeBuilder.AppendLine("/// </summary>");
×
106
        }
107

108
        CodeBuilder.AppendLine($"public {entityClass}()");
22✔
109
        CodeBuilder.AppendLine("{");
22✔
110

111
        using (CodeBuilder.Indent())
22✔
112
        {
113
            CodeBuilder.AppendLine("#region Generated Constructor");
22✔
114
            foreach (var relationship in relationships)
68✔
115
            {
116
                var propertyName = relationship.PropertyName.ToSafeName();
12✔
117

118
                var primaryNamespace = relationship.PrimaryEntity.EntityNamespace;
12✔
119
                var primaryName = relationship.PrimaryEntity.EntityClass.ToSafeName();
12✔
120
                var primaryFullName = _entity.EntityNamespace != primaryNamespace
12!
121
                    ? $"{primaryNamespace}.{primaryName}"
12✔
122
                    : primaryName;
12✔
123

124
                CodeBuilder.AppendLine($"{propertyName} = new HashSet<{primaryFullName}>();");
12✔
125
            }
126
            CodeBuilder.AppendLine("#endregion");
22✔
127
        }
22✔
128

129
        CodeBuilder.AppendLine("}");
22✔
130
        CodeBuilder.AppendLine();
22✔
131
    }
22✔
132

133
    private void GenerateProperties()
134
    {
135
        CodeBuilder.AppendLine("#region Generated Properties");
22✔
136
        foreach (var property in _entity.Properties)
464✔
137
        {
138
            var propertyType = property.SystemType.ToType();
210✔
139
            var propertyName = property.PropertyName.ToSafeName();
210✔
140

141
            if (Options.Data.Entity.Document)
210!
142
            {
143
                CodeBuilder.AppendLine("/// <summary>");
×
144
                CodeBuilder.AppendLine($"/// Gets or sets the property value representing column '{property.ColumnName}'.");
×
145
                CodeBuilder.AppendLine("/// </summary>");
×
146
                CodeBuilder.AppendLine("/// <value>");
×
147
                CodeBuilder.AppendLine($"/// The property value representing column '{property.ColumnName}'.");
×
148
                CodeBuilder.AppendLine("/// </value>");
×
149
            }
150

151
            if (Options.Data.Entity.MappingAttributes)
210!
152
            {
153
                if (property.IsPrimaryKey == true)
×
154
                {
155
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.Key()]");
×
156
                }
157

158
                if (property.IsConcurrencyToken == true)
×
159
                {
160
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.ConcurrencyCheck()]");
×
161
                }
162

163
                CodeBuilder.AppendLine($"[System.ComponentModel.DataAnnotations.Schema.Column(\"{property.ColumnName}\", TypeName = \"{property.StoreType}\")]");
×
164

165
                if (property.IsRowVersion == true || property.ValueGenerated == ValueGenerated.OnAddOrUpdate)
×
166
                {
167
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]");
×
168
                }
169
                else if (property.ValueGenerated == ValueGenerated.OnAdd)
×
170
                {
171
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]");
×
172
                }
173
            }
174

175
            if (property.IsNullable == true && (property.SystemType.IsValueType || Options.Project.Nullable))
210✔
176
                CodeBuilder.AppendLine($"public {propertyType}? {propertyName} {{ get; set; }}");
20✔
177
            else if (Options.Project.Nullable && !property.SystemType.IsValueType)
190!
178
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }} = null!;");
×
179
            else
180
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }}");
190✔
181

182
            CodeBuilder.AppendLine();
210✔
183
        }
184
        CodeBuilder.AppendLine("#endregion");
22✔
185
        CodeBuilder.AppendLine();
22✔
186
    }
22✔
187

188
    private void GenerateRelationshipProperties()
189
    {
190
        CodeBuilder.AppendLine("#region Generated Relationships");
22✔
191
        foreach (var relationship in _entity.Relationships.OrderBy(r => r.PropertyName))
128✔
192
        {
193
            var propertyName = relationship.PropertyName.ToSafeName();
28✔
194
            var primaryNamespace = relationship.PrimaryEntity.EntityNamespace;
28✔
195
            var primaryName = relationship.PrimaryEntity.EntityClass.ToSafeName();
28✔
196
            var primaryFullName = _entity.EntityNamespace != primaryNamespace
28!
197
                ? $"{primaryNamespace}.{primaryName}"
28✔
198
                : primaryName;
28✔
199

200
            if (relationship.Cardinality == Cardinality.Many)
28✔
201
            {
202
                if (Options.Data.Entity.Document)
12!
203
                {
204
                    CodeBuilder.AppendLine("/// <summary>");
×
205
                    CodeBuilder.AppendLine($"/// Gets or sets the navigation collection for entity <see cref=\"{primaryFullName}\" />.");
×
206
                    CodeBuilder.AppendLine("/// </summary>");
×
207
                    CodeBuilder.AppendLine("/// <value>");
×
208
                    CodeBuilder.AppendLine($"/// The navigation collection for entity <see cref=\"{primaryFullName}\" />.");
×
209
                    CodeBuilder.AppendLine("/// </value>");
×
210
                }
211

212

213
                CodeBuilder.AppendLine($"public virtual ICollection<{primaryFullName}> {propertyName} {{ get; set; }}");
12✔
214
                CodeBuilder.AppendLine();
12✔
215
            }
216
            else
217
            {
218
                if (Options.Data.Entity.Document)
16!
219
                {
220
                    CodeBuilder.AppendLine("/// <summary>");
×
221
                    CodeBuilder.AppendLine($"/// Gets or sets the navigation property for entity <see cref=\"{primaryFullName}\" />.");
×
222
                    CodeBuilder.AppendLine("/// </summary>");
×
223
                    CodeBuilder.AppendLine("/// <value>");
×
224
                    CodeBuilder.AppendLine($"/// The navigation property for entity <see cref=\"{primaryFullName}\" />.");
×
225
                    CodeBuilder.AppendLine("/// </value>");
×
226

227
                    foreach (var property in relationship.Properties)
×
228
                        CodeBuilder.AppendLine($"/// <seealso cref=\"{property.PropertyName}\" />");
×
229
                }
230

231
                if (!Options.Project.Nullable)
16!
232
                    CodeBuilder.AppendLine($"public virtual {primaryFullName} {propertyName} {{ get; set; }}");
16✔
233
                else if (relationship.Cardinality == Cardinality.One)
×
234
                    CodeBuilder.AppendLine($"public virtual {primaryFullName} {propertyName} {{ get; set; }} = null!;");
×
235
                else
236
                    CodeBuilder.AppendLine($"public virtual {primaryFullName}? {propertyName} {{ get; set; }}");
×
237

238
                CodeBuilder.AppendLine();
16✔
239
            }
240
        }
241
        CodeBuilder.AppendLine("#endregion");
22✔
242
        CodeBuilder.AppendLine();
22✔
243
    }
22✔
244
}
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

© 2025 Coveralls, Inc