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

loresoft / EntityFrameworkCore.Generator / 9861674047

09 Jul 2024 05:37PM UTC coverage: 56.772% (-0.2%) from 56.999%
9861674047

push

github

pwelter34
Update User.cs

566 of 1125 branches covered (50.31%)

Branch coverage included in aggregate %.

1815 of 3069 relevant lines covered (59.14%)

83.9 hits per line

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

60.96
/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)
33✔
16
    {
17
        _entity = entity;
33✔
18
    }
33✔
19

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

24
        CodeBuilder.AppendLine("using System;");
33✔
25
        CodeBuilder.AppendLine("using System.Collections.Generic;");
33✔
26
        CodeBuilder.AppendLine();
33✔
27

28
        CodeBuilder.Append($"namespace {_entity.EntityNamespace}");
33✔
29

30
        if (Options.Project.FileScopedNamespace)
33!
31
        {
32
            CodeBuilder.AppendLine(";");
×
33
            CodeBuilder.AppendLine();
×
34
            GenerateClass();
×
35
        }
36
        else
37
        {
38
            CodeBuilder.AppendLine();
33✔
39
            CodeBuilder.AppendLine("{");
33✔
40

41
            using (CodeBuilder.Indent())
33✔
42
            {
43
                GenerateClass();
33✔
44
            }
33✔
45

46
            CodeBuilder.AppendLine("}");
33✔
47
        }
48

49
        return CodeBuilder.ToString();
33✔
50
    }
51

52
    private void GenerateClass()
53
    {
54
        var entityClass = _entity.EntityClass.ToSafeName();
33✔
55

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

68
        if (_entity.EntityBaseClass.HasValue())
33!
69
        {
70
            var entityBaseClass = _entity.EntityBaseClass.ToSafeName();
×
71
            using (CodeBuilder.Indent())
×
72
                CodeBuilder.AppendLine($": {entityBaseClass}");
×
73
        }
74

75
        CodeBuilder.AppendLine("{");
33✔
76

77
        using (CodeBuilder.Indent())
33✔
78
        {
79
            GenerateConstructor();
33✔
80

81
            GenerateProperties();
33✔
82
            GenerateRelationshipProperties();
33✔
83
        }
33✔
84

85
        CodeBuilder.AppendLine("}");
33✔
86

87
    }
33✔
88

89
    private void GenerateConstructor()
90
    {
91
        var relationships = _entity.Relationships
33✔
92
            .Where(r => r.Cardinality == Cardinality.Many)
42✔
93
            .OrderBy(r => r.PropertyName)
18✔
94
            .ToList();
33✔
95

96
        var entityClass = _entity.EntityClass.ToSafeName();
33✔
97

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

105
        CodeBuilder.AppendLine($"public {entityClass}()");
33✔
106
        CodeBuilder.AppendLine("{");
33✔
107

108
        using (CodeBuilder.Indent())
33✔
109
        {
110
            CodeBuilder.AppendLine("#region Generated Constructor");
33✔
111
            foreach (var relationship in relationships)
102✔
112
            {
113
                var propertyName = relationship.PropertyName.ToSafeName();
18✔
114

115
                var primaryNamespace = relationship.PrimaryEntity.EntityNamespace;
18✔
116
                var primaryName = relationship.PrimaryEntity.EntityClass.ToSafeName();
18✔
117
                var primaryFullName = _entity.EntityNamespace != primaryNamespace
18!
118
                    ? $"{primaryNamespace}.{primaryName}"
18✔
119
                    : primaryName;
18✔
120

121
                CodeBuilder.AppendLine($"{propertyName} = new HashSet<{primaryFullName}>();");
18✔
122
            }
123
            CodeBuilder.AppendLine("#endregion");
33✔
124
        }
33✔
125

126
        CodeBuilder.AppendLine("}");
33✔
127
        CodeBuilder.AppendLine();
33✔
128
    }
33✔
129

130
    private void GenerateProperties()
131
    {
132
        CodeBuilder.AppendLine("#region Generated Properties");
33✔
133
        foreach (var property in _entity.Properties)
696✔
134
        {
135
            var propertyType = property.SystemType.ToType();
315✔
136
            var propertyName = property.PropertyName.ToSafeName();
315✔
137

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

148
            if (Options.Data.Entity.MappingAttributes)
315!
149
            {
150
                if (property.IsPrimaryKey == true)
×
151
                {
152
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.Key()]");
×
153
                }
154

155
                if (property.IsConcurrencyToken == true)
×
156
                {
157
                    CodeBuilder.AppendLine("[System.ComponentModel.DataAnnotations.ConcurrencyCheck()]");
×
158
                }
159

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

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

172
            if (property.IsNullable == true && (property.SystemType.IsValueType || Options.Project.Nullable))
315✔
173
                CodeBuilder.AppendLine($"public {propertyType}? {propertyName} {{ get; set; }}");
30✔
174
            else if (Options.Project.Nullable && !property.SystemType.IsValueType)
285!
175
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }} = null!;");
×
176
            else
177
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }}");
285✔
178

179
            CodeBuilder.AppendLine();
315✔
180
        }
181
        CodeBuilder.AppendLine("#endregion");
33✔
182
        CodeBuilder.AppendLine();
33✔
183
    }
33✔
184

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

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

209

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

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

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

235
                CodeBuilder.AppendLine();
24✔
236
            }
237
        }
238
        CodeBuilder.AppendLine("#endregion");
33✔
239
        CodeBuilder.AppendLine();
33✔
240
    }
33✔
241
}
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