Skip to content

Commit fecbea6

Browse files
committed
Refactor how access for parent reference is set
See #120 +semver:breaking
1 parent b983da8 commit fecbea6

File tree

5 files changed

+36
-18
lines changed

5 files changed

+36
-18
lines changed

src/FluentNHibernate.Testing/DomainModel/Mapping/ComponentElementPartTester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void CanSetParentReferenceAccess()
3030
.Component(c =>
3131
{
3232
c.Map(x => x.Name);
33-
c.ParentReference(x => x.MyParent, FluentNHibernate.Mapping.Access.BackField);
33+
c.ParentReference(x => x.MyParent, x => x.Access.BackingField());
3434
}))
3535
.Element("class/bag/composite-element/parent").Exists()
3636
.HasAttribute("name", "MyParent")

src/FluentNHibernate.Testing/DomainModel/Mapping/ComponentPartTester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void ComponentCanSetParentReferenceAccessStrategy()
2727
m.Component(x => x.Component, c =>
2828
{
2929
c.Map(x => x.Name);
30-
c.ParentReference(x => x.MyParent, FluentNHibernate.Mapping.Access.BackField);
30+
c.ParentReference(x => x.MyParent, x => x.Access.BackingField());
3131
}))
3232
.Element("class/component/parent").ShouldBeInParentAtPosition(0)
3333
.HasAttribute("name", "MyParent")

src/FluentNHibernate/Mapping/ComponentPartBase.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,36 @@ public AccessStrategyBuilder<TBuilder> Access
5959
/// </example>
6060
public TBuilder ParentReference(Expression<Func<TEntity, object>> expression)
6161
{
62-
var property = expression.ToMember();
63-
return ParentReference(property, MemberAccessResolver.Resolve(property));
62+
return ParentReference(expression, null);
6463
}
6564

6665
/// <summary>
6766
/// Specify a parent reference for this component
6867
/// </summary>
6968
/// <param name="expression">Parent property</param>
70-
/// <param name="access">Access to parent property</param>
69+
/// <param name="customMapping">Additional settings for the parent reference property</param>
7170
/// <example>
7271
/// ParentReference(x => x.Parent, Access.Backfield);
7372
/// </example>
74-
public TBuilder ParentReference(Expression<Func<TEntity, object>> expression, Access access)
73+
public TBuilder ParentReference(Expression<Func<TEntity, object>> expression, Action<ParentPropertyPart> customMapping)
7574
{
76-
return ParentReference(expression.ToMember(), access);
75+
return ParentReference(expression.ToMember(), customMapping);
7776
}
7877

79-
TBuilder ParentReference(Member property, Access access)
78+
TBuilder ParentReference(Member property, Action<ParentPropertyPart> customMapping)
8079
{
8180
var parentMapping = new ParentMapping
8281
{
8382
ContainingEntityType = typeof(TEntity)
8483
};
8584
parentMapping.Set(x => x.Name, Layer.Defaults, property.Name);
8685

87-
if (access != Mapping.Access.Property && access != Mapping.Access.Unset)
88-
parentMapping.Set(x => x.Access, Layer.Defaults, access.ToString());
89-
86+
var defaultAccess = MemberAccessResolver.Resolve(property);
87+
if (defaultAccess != Mapping.Access.Property && defaultAccess != Mapping.Access.Unset)
88+
parentMapping.Set(x => x.Access, Layer.Defaults, defaultAccess.ToString());
89+
90+
customMapping?.Invoke(new ParentPropertyPart(parentMapping));
91+
9092
attributes.Set("Parent", Layer.Defaults, parentMapping);
9193

9294
return (TBuilder)this;

src/FluentNHibernate/Mapping/CompositeElementPart.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq.Expressions;
4-
using System.Reflection;
54
using FluentNHibernate.Mapping.Providers;
65
using FluentNHibernate.MappingModel;
76
using FluentNHibernate.MappingModel.Collections;
@@ -118,32 +117,34 @@ protected virtual ManyToOnePart<TOther> References<TOther>(Member property, stri
118117
/// <returns>Component being mapped</returns>
119118
public void ParentReference(Expression<Func<T, object>> expression)
120119
{
121-
var property = expression.ToMember();
122-
ParentReference(property, MemberAccessResolver.Resolve(property));
120+
ParentReference(expression, null);
123121
}
124122

125123
/// <summary>
126124
/// Maps a property of the component class as a reference back to the containing entity
127125
/// </summary>
128126
/// <param name="expression">Parent reference property</param>
129-
/// <param name="access">Access to parent reference property</param>
127+
/// <param name="customMapping">Additional settings for the parent reference property</param>
130128
/// <returns>Component being mapped</returns>
131-
public void ParentReference(Expression<Func<T, object>> expression, Access access)
129+
public void ParentReference(Expression<Func<T, object>> expression, Action<ParentPropertyPart> customMapping)
132130
{
133-
ParentReference(expression.ToMember(), access);
131+
ParentReference(expression.ToMember(), customMapping);
134132
}
135133

136-
void ParentReference(Member property, Access access)
134+
void ParentReference(Member property, Action<ParentPropertyPart> customMapping)
137135
{
138136
var parentMapping = new ParentMapping
139137
{
140138
ContainingEntityType = entity
141139
};
142140
parentMapping.Set(x => x.Name, Layer.Defaults, property.Name);
143141

142+
var access = MemberAccessResolver.Resolve(property);
144143
if (access != Access.Property && access != Access.Unset)
145144
parentMapping.Set(x => x.Access, Layer.Defaults, access.ToString());
146145

146+
customMapping?.Invoke(new ParentPropertyPart(parentMapping));
147+
147148
attributes.Set("Parent", Layer.Defaults, parentMapping);
148149
}
149150

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using FluentNHibernate.MappingModel;
2+
3+
namespace FluentNHibernate.Mapping
4+
{
5+
public class ParentPropertyPart
6+
{
7+
public ParentPropertyPart(ParentMapping mapping)
8+
{
9+
Access = new AccessStrategyBuilder<ParentPropertyPart>(this,
10+
value => mapping.Set(x => x.Access, Layer.UserSupplied, value));
11+
}
12+
13+
public AccessStrategyBuilder<ParentPropertyPart> Access { get; }
14+
}
15+
}

0 commit comments

Comments
 (0)