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

loresoft / EntityFrameworkCore.Generator / 5698020083

29 Jul 2023 02:14AM UTC coverage: 45.814%. First build
5698020083

push

github

pwelter34
Merge branch 'master' of https://github.com/loresoft/EntityFrameworkCore.Generator

382 of 1007 branches covered (37.93%)

Branch coverage included in aggregate %.

3 of 3 new or added lines in 2 files covered. (100.0%)

1320 of 2708 relevant lines covered (48.74%)

33.13 hits per line

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

68.13
/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
namespace EntityFrameworkCore.Generator.Templates;
8

9
public class EntityClassTemplate : CodeTemplateBase
10
{
11
    private readonly Entity _entity;
12

13
    public EntityClassTemplate(Entity entity, GeneratorOptions options) : base(options)
10✔
14
    {
15
        _entity = entity;
10✔
16
    }
10✔
17

18
    public override string WriteCode()
19
    {
20
        CodeBuilder.Clear();
10✔
21

22
        CodeBuilder.AppendLine("using System;");
10✔
23
        CodeBuilder.AppendLine("using System.Collections.Generic;");
10✔
24
        CodeBuilder.AppendLine();
10✔
25

26
        CodeBuilder.Append($"namespace {_entity.EntityNamespace}");
10✔
27

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

38
            using (CodeBuilder.Indent())
10✔
39
            {
40
                GenerateClass();
10✔
41
            }
10✔
42

43
            CodeBuilder.AppendLine("}");
10✔
44
        }
45

46
        return CodeBuilder.ToString();
10✔
47
    }
48

49
    private void GenerateClass()
50
    {
51
        var entityClass = _entity.EntityClass.ToSafeName();
10✔
52

53
        if (Options.Data.Entity.Document)
10!
54
        {
55
            CodeBuilder.AppendLine("/// <summary>");
×
56
            CodeBuilder.AppendLine($"/// Entity class representing data for table '{_entity.TableName}'.");
×
57
            CodeBuilder.AppendLine("/// </summary>");
×
58
        }
59

60
        CodeBuilder.AppendLine($"public partial class {entityClass}");
10✔
61

62
        if (_entity.EntityBaseClass.HasValue())
10!
63
        {
64
            var entityBaseClass = _entity.EntityBaseClass.ToSafeName();
×
65
            using (CodeBuilder.Indent())
×
66
                CodeBuilder.AppendLine($": {entityBaseClass}");
×
67
        }
68

69
        CodeBuilder.AppendLine("{");
10✔
70

71
        using (CodeBuilder.Indent())
10✔
72
        {
73
            GenerateConstructor();
10✔
74

75
            GenerateProperties();
10✔
76
            GenerateRelationshipProperties();
10✔
77
        }
10✔
78

79
        CodeBuilder.AppendLine("}");
10✔
80

81
    }
10✔
82

83
    private void GenerateConstructor()
84
    {
85
        var relationships = _entity.Relationships
10✔
86
            .Where(r => r.Cardinality == Cardinality.Many)
10✔
87
            .OrderBy(r => r.PropertyName)
10✔
88
            .ToList();
10✔
89

90
        var entityClass = _entity.EntityClass.ToSafeName();
10✔
91

92
        if (Options.Data.Entity.Document)
10!
93
        {
94
            CodeBuilder.AppendLine("/// <summary>");
×
95
            CodeBuilder.AppendLine($"/// Initializes a new instance of the <see cref=\"{entityClass}\"/> class.");
×
96
            CodeBuilder.AppendLine("/// </summary>");
×
97
        }
98

99
        CodeBuilder.AppendLine($"public {entityClass}()");
10✔
100
        CodeBuilder.AppendLine("{");
10✔
101

102
        using (CodeBuilder.Indent())
10✔
103
        {
104
            CodeBuilder.AppendLine("#region Generated Constructor");
10✔
105
            foreach (var relationship in relationships)
32✔
106
            {
107
                var propertyName = relationship.PropertyName.ToSafeName();
6✔
108

109
                var primaryNamespace = relationship.PrimaryEntity.EntityNamespace;
6✔
110
                var primaryName = relationship.PrimaryEntity.EntityClass.ToSafeName();
6✔
111
                var primaryFullName = _entity.EntityNamespace != primaryNamespace
6!
112
                    ? $"{primaryNamespace}.{primaryName}"
6✔
113
                    : primaryName;
6✔
114

115
                CodeBuilder.AppendLine($"{propertyName} = new HashSet<{primaryFullName}>();");
6✔
116
            }
117
            CodeBuilder.AppendLine("#endregion");
10✔
118
        }
10✔
119

120
        CodeBuilder.AppendLine("}");
10✔
121
        CodeBuilder.AppendLine();
10✔
122
    }
10✔
123

124
    private void GenerateProperties()
125
    {
126
        CodeBuilder.AppendLine("#region Generated Properties");
10✔
127
        foreach (var property in _entity.Properties)
222✔
128
        {
129
            var propertyType = property.SystemType.ToType();
101✔
130
            var propertyName = property.PropertyName.ToSafeName();
101✔
131

132
            if (Options.Data.Entity.Document)
101!
133
            {
134
                CodeBuilder.AppendLine("/// <summary>");
×
135
                CodeBuilder.AppendLine($"/// Gets or sets the property value representing column '{property.ColumnName}'.");
×
136
                CodeBuilder.AppendLine("/// </summary>");
×
137
                CodeBuilder.AppendLine("/// <value>");
×
138
                CodeBuilder.AppendLine($"/// The property value representing column '{property.ColumnName}'.");
×
139
                CodeBuilder.AppendLine("/// </value>");
×
140
            }
141

142
            if (property.IsNullable == true && (property.SystemType.IsValueType || Options.Project.Nullable))
101✔
143
                CodeBuilder.AppendLine($"public {propertyType}? {propertyName} {{ get; set; }}");
10✔
144
            else if (Options.Project.Nullable && !property.SystemType.IsValueType)
91!
145
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }} = null!;");
×
146
            else
147
                CodeBuilder.AppendLine($"public {propertyType} {propertyName} {{ get; set; }}");
91✔
148

149
            CodeBuilder.AppendLine();
101✔
150
        }
151
        CodeBuilder.AppendLine("#endregion");
10✔
152
        CodeBuilder.AppendLine();
10✔
153
    }
10✔
154

155
    private void GenerateRelationshipProperties()
156
    {
157
        CodeBuilder.AppendLine("#region Generated Relationships");
10✔
158
        foreach (var relationship in _entity.Relationships.OrderBy(r => r.PropertyName))
48✔
159
        {
160
            var propertyName = relationship.PropertyName.ToSafeName();
14✔
161
            var primaryNamespace = relationship.PrimaryEntity.EntityNamespace;
14✔
162
            var primaryName = relationship.PrimaryEntity.EntityClass.ToSafeName();
14✔
163
            var primaryFullName = _entity.EntityNamespace != primaryNamespace
14!
164
                ? $"{primaryNamespace}.{primaryName}"
14✔
165
                : primaryName;
14✔
166

167
            if (relationship.Cardinality == Cardinality.Many)
14✔
168
            {
169
                if (Options.Data.Entity.Document)
6!
170
                {
171
                    CodeBuilder.AppendLine("/// <summary>");
×
172
                    CodeBuilder.AppendLine($"/// Gets or sets the navigation collection for entity <see cref=\"{primaryFullName}\" />.");
×
173
                    CodeBuilder.AppendLine("/// </summary>");
×
174
                    CodeBuilder.AppendLine("/// <value>");
×
175
                    CodeBuilder.AppendLine($"/// The navigation collection for entity <see cref=\"{primaryFullName}\" />.");
×
176
                    CodeBuilder.AppendLine("/// </value>");
×
177
                }
178

179

180
                CodeBuilder.AppendLine($"public virtual ICollection<{primaryFullName}> {propertyName} {{ get; set; }}");
6✔
181
                CodeBuilder.AppendLine();
6✔
182
            }
183
            else
184
            {
185
                if (Options.Data.Entity.Document)
8!
186
                {
187
                    CodeBuilder.AppendLine("/// <summary>");
×
188
                    CodeBuilder.AppendLine($"/// Gets or sets the navigation property for entity <see cref=\"{primaryFullName}\" />.");
×
189
                    CodeBuilder.AppendLine("/// </summary>");
×
190
                    CodeBuilder.AppendLine("/// <value>");
×
191
                    CodeBuilder.AppendLine($"/// The navigation property for entity <see cref=\"{primaryFullName}\" />.");
×
192
                    CodeBuilder.AppendLine("/// </value>");
×
193

194
                    foreach (var property in relationship.Properties)
×
195
                        CodeBuilder.AppendLine($"/// <seealso cref=\"{property.PropertyName}\" />");
×
196
                }
197

198
                if (!Options.Project.Nullable)
8!
199
                    CodeBuilder.AppendLine($"public virtual {primaryFullName} {propertyName} {{ get; set; }}");
8✔
200
                else if (relationship.Cardinality == Cardinality.One)
×
201
                    CodeBuilder.AppendLine($"public virtual {primaryFullName} {propertyName} {{ get; set; }} = null!;");
×
202
                else
203
                    CodeBuilder.AppendLine($"public virtual {primaryFullName}? {propertyName} {{ get; set; }}");
×
204

205
                CodeBuilder.AppendLine();
8✔
206
            }
207
        }
208
        CodeBuilder.AppendLine("#endregion");
10✔
209
        CodeBuilder.AppendLine();
10✔
210
    }
10✔
211
}
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