Skip to content

Commit 53980c6

Browse files
committed
Merge pull request #286 from jaxx/master
append cascade options instead of overwriting + added missing cascade options
2 parents cec3322 + 7c9d388 commit 53980c6

File tree

6 files changed

+122
-23
lines changed

6 files changed

+122
-23
lines changed

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,35 @@ public void Merge_should_add_the_correct_cascade_attribute_to_the_parent_part()
6363
{
6464
A_call_to(_cascade.Merge).should_set_the_cascade_value_to("merge");
6565
}
66-
}
66+
67+
[Test]
68+
public void Refresh_should_add_the_correct_cascade_attribute_to_the_parent_part()
69+
{
70+
A_call_to(_cascade.Refresh).should_set_the_cascade_value_to("refresh");
71+
}
72+
73+
[Test]
74+
public void DeleteOrphans_should_add_the_correct_cascade_attribute_to_the_parent_part()
75+
{
76+
A_call_to(_cascade.DeleteOrphans).should_set_the_cascade_value_to("delete-orphans");
77+
}
78+
79+
[Test]
80+
public void Evict_should_add_the_correct_cascade_attribute_to_the_parent_part()
81+
{
82+
A_call_to(_cascade.Evict).should_set_the_cascade_value_to("evict");
83+
}
84+
85+
[Test]
86+
public void Lock_should_add_the_correct_cascade_attribute_to_the_parent_part()
87+
{
88+
A_call_to(_cascade.Lock).should_set_the_cascade_value_to("lock");
89+
}
90+
91+
[Test]
92+
public void Persist_should_add_the_correct_cascade_attribute_to_the_parent_part()
93+
{
94+
A_call_to(_cascade.Persist).should_set_the_cascade_value_to("save-update, persist");
95+
}
96+
}
6797
}

src/FluentNHibernate.Testing/FluentInterfaceTests/ManyToOneMutablePropertyModelGenerationTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ public void CascadeShouldSetModelCascadePropertyToValue()
2525
.ModelShouldMatch(x => x.Cascade.ShouldEqual("all"));
2626
}
2727

28+
[Test]
29+
public void CascadeShouldAppendModelCascadePropertyToValue()
30+
{
31+
ManyToOne()
32+
.Mapping(m => { m.Cascade.SaveUpdate(); m.Cascade.Merge(); })
33+
.ModelShouldMatch(x => x.Cascade.ShouldEqual("save-update,merge"));
34+
}
35+
2836
[Test]
2937
public void ShouldSetModelClassPropertyToPropertyType()
3038
{

src/FluentNHibernate.Testing/FluentInterfaceTests/OneToManyMutablePropertyModelGenerationTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ public void CascadeShouldSetModelCascadePropertyToValue()
4545
.ModelShouldMatch(x => x.Cascade.ShouldEqual("all"));
4646
}
4747

48+
[Test]
49+
public void CascadeShouldAppendModelCascadePropertyToValue()
50+
{
51+
OneToMany(x => x.BagOfChildren)
52+
.Mapping(m => { m.Cascade.SaveUpdate(); m.Cascade.Merge(); })
53+
.ModelShouldMatch(x => x.Cascade.ShouldEqual("save-update,merge"));
54+
}
55+
4856
[Test]
4957
public void CollectionTypeShouldSetModelCollectionTypePropertyToValue()
5058
{

src/FluentNHibernate/Mapping/CascadeExpression.cs

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace FluentNHibernate.Mapping
44
{
55
public class CascadeExpression<TParent>
6-
{
6+
{
77
private readonly TParent parent;
88
private readonly Action<string> setter;
99

@@ -17,40 +17,40 @@ public CascadeExpression(TParent parent, Action<string> setter)
1717
/// Cascade all actions
1818
/// </summary>
1919
public TParent All()
20-
{
21-
setter("all");
22-
return parent;
23-
}
20+
{
21+
setter("all");
22+
return parent;
23+
}
2424

2525
/// <summary>
2626
/// Cascade no actions
2727
/// </summary>
28-
public TParent None()
29-
{
30-
setter("none");
28+
public TParent None()
29+
{
30+
setter("none");
3131
return parent;
32-
}
32+
}
3333

3434
/// <summary>
3535
/// Cascade saves and updates
3636
/// </summary>
37-
public TParent SaveUpdate()
38-
{
39-
setter("save-update");
37+
public TParent SaveUpdate()
38+
{
39+
setter("save-update");
4040
return parent;
41-
}
41+
}
4242

4343
/// <summary>
4444
/// Cascade deletes
4545
/// </summary>
46-
public TParent Delete()
47-
{
48-
setter("delete");
46+
public TParent Delete()
47+
{
48+
setter("delete");
4949
return parent;
50-
}
50+
}
5151

5252
/// <summary>
53-
/// Cascade deletes
53+
/// Cascade merges
5454
/// </summary>
5555
public TParent Merge()
5656
{
@@ -66,5 +66,50 @@ public TParent Replicate()
6666
setter("replicate");
6767
return parent;
6868
}
69-
}
70-
}
69+
70+
/// <summary>
71+
/// Cascade refreshes
72+
/// </summary>
73+
public TParent Refresh()
74+
{
75+
setter("refresh");
76+
return parent;
77+
}
78+
79+
/// <summary>
80+
/// Cascade deletes orphans
81+
/// </summary>
82+
public TParent DeleteOrphans()
83+
{
84+
setter("delete-orphans");
85+
return parent;
86+
}
87+
88+
/// <summary>
89+
/// Cascade evicts
90+
/// </summary>
91+
public TParent Evict()
92+
{
93+
setter("evict");
94+
return parent;
95+
}
96+
97+
/// <summary>
98+
/// Cascade locks
99+
/// </summary>
100+
public TParent Lock()
101+
{
102+
setter("lock");
103+
return parent;
104+
}
105+
106+
/// <summary>
107+
/// Cascade persists
108+
/// </summary>
109+
public TParent Persist()
110+
{
111+
setter("save-update, persist");
112+
return parent;
113+
}
114+
}
115+
}

src/FluentNHibernate/Mapping/ManyToOnePart.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ public ManyToOnePart(Type entity, Member member)
2727
this.member = member;
2828
access = new AccessStrategyBuilder<ManyToOnePart<TOther>>(this, value => attributes.Set("Access", Layer.UserSupplied, value));
2929
fetch = new FetchTypeExpression<ManyToOnePart<TOther>>(this, value => attributes.Set("Fetch", Layer.UserSupplied, value));
30-
cascade = new CascadeExpression<ManyToOnePart<TOther>>(this, value => attributes.Set("Cascade", Layer.UserSupplied, value));
30+
cascade = new CascadeExpression<ManyToOnePart<TOther>>(this, value =>
31+
{
32+
var current = attributes.Get("Cascade") as string;
33+
attributes.Set("Cascade", Layer.UserSupplied, current == null ? value : string.Format("{0},{1}", current, value));
34+
});
3135
notFound = new NotFoundExpression<ManyToOnePart<TOther>>(this, value => attributes.Set("NotFound", Layer.UserSupplied, value));
3236

3337
SetDefaultAccess();

src/FluentNHibernate/Mapping/OneToManyPart.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ protected OneToManyPart(Type entity, Member member, Type collectionType)
3131
childType = collectionType;
3232

3333
keyColumns = new ColumnMappingCollection<OneToManyPart<TChild>>(this);
34-
cascade = new CollectionCascadeExpression<OneToManyPart<TChild>>(this, value => collectionAttributes.Set("Cascade", Layer.UserSupplied, value));
34+
cascade = new CollectionCascadeExpression<OneToManyPart<TChild>>(this, value =>
35+
{
36+
var current = collectionAttributes.Get("Cascade") as string;
37+
collectionAttributes.Set("Cascade", Layer.UserSupplied, current == null ? value : string.Format("{0},{1}", current, value));
38+
});
3539
notFound = new NotFoundExpression<OneToManyPart<TChild>>(this, value => relationshipAttributes.Set("NotFound", Layer.UserSupplied, value));
3640

3741
collectionAttributes.Set("Name", Layer.Defaults, member.Name);

0 commit comments

Comments
 (0)