Skip to content

Commit bbb32c0

Browse files
committed
Proper exception handling for RegisterPrivateAccessor()
- Add proper handling when a property’s backing field cannot be inferred or the unsafe accessor cannot be generated. - Add DesignStrings methods and entries to .resx Fixes #35219
1 parent 6165bc9 commit bbb32c0

3 files changed

Lines changed: 30 additions & 2 deletions

File tree

src/EFCore.Design/Properties/DesignStrings.Designer.cs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/EFCore.Design/Properties/DesignStrings.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@
156156
<data name="CompilationMustBeLoaded" xml:space="preserve">
157157
<value>A compilation must be loaded.</value>
158158
</data>
159+
<data name="CompiledModelBackingFieldNotFound" xml:space="preserve">
160+
<value>Backing field for property '{entityType}.{propertyName}' could not be inferred. Use a matching field name or configure with HasField().</value>
161+
</data>
159162
<data name="CompiledModelConstructorBinding" xml:space="preserve">
160163
<value>The entity type '{entityType}' has a custom constructor binding. Compiled model can't be generated, because custom constructor bindings are not supported. Configure the custom constructor binding in '{customize}' in a partial '{className}' class instead.</value>
161164
</data>
@@ -168,6 +171,9 @@
168171
<data name="CompiledModelQueryFilter" xml:space="preserve">
169172
<value>The entity type '{entityType}' has a query filter configured. Compiled model can't be generated, because query filters are not supported.</value>
170173
</data>
174+
<data name="CompiledModelUnsafeAccessorNull" xml:space="preserve">
175+
<value>Unsafe accessor for property '{entityType}.{propertyName}' could not be generated. Ensure the property can be accessed or has a matching backing field.</value>
176+
</data>
171177
<data name="CompiledModelValueGenerator" xml:space="preserve">
172178
<value>The property '{entityType}.{property}' has a value generator configured. Use '{method}' to configure the value generator factory type.</value>
173179
</data>

src/EFCore.Design/Scaffolding/Internal/CSharpRuntimeModelCodeGenerator.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,7 +1769,9 @@ private void RegisterPrivateAccessors(
17691769
Dictionary<Type, HashSet<MemberInfo>> unsafeAccessorTypes,
17701770
ref Dictionary<MemberInfo, QualifiedName>? memberAccessReplacements)
17711771
{
1772-
var member = property.GetMemberInfo(forMaterialization, forSet);
1772+
var member = property.GetMemberInfo(forMaterialization, forSet) ?? throw new InvalidOperationException(
1773+
DesignStrings.CompiledModelBackingFieldNotFound(property.DeclaringType.ShortName(), property.Name));
1774+
17731775
switch (member)
17741776
{
17751777
case FieldInfo field:
@@ -1799,7 +1801,9 @@ private void RegisterPrivateAccessors(
17991801
}
18001802

18011803
memberAccessReplacements ??= [];
1802-
var methodName = LinqToCSharpSyntaxTranslator.GetUnsafeAccessorName(member);
1804+
1805+
var methodName = LinqToCSharpSyntaxTranslator.GetUnsafeAccessorName(member) ?? throw new InvalidOperationException(
1806+
DesignStrings.CompiledModelUnsafeAccessorNull(property.DeclaringType.ShortName(), property.Name));
18031807

18041808
var declaringType = member.DeclaringType!;
18051809
if (declaringType.IsGenericType

0 commit comments

Comments
 (0)