Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 6b28264

Browse files
committed
Add support for using mixed name and alias conventions
1 parent 3bfbdab commit 6b28264

File tree

5 files changed

+112
-12
lines changed

5 files changed

+112
-12
lines changed

src/ServiceStack.OrmLite/FieldDefinition.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ public bool ShouldSkipDelete()
110110
{
111111
return IsComputed;
112112
}
113+
114+
public bool IsSelfRefField(FieldDefinition fieldDef)
115+
{
116+
return (fieldDef.Alias != null && IsSelfRefField(fieldDef.Alias))
117+
|| IsSelfRefField(fieldDef.Name);
118+
}
119+
120+
public bool IsSelfRefField(string name)
121+
{
122+
return (Alias != null && Alias + "Id" == name)
123+
|| Name + "Id" == name;
124+
}
113125
}
114126

115127
public class ForeignKeyConstraint

src/ServiceStack.OrmLite/ModelDefinition.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,18 @@ public void AfterInit()
139139
allItems.AddRange(IgnoredFieldDefinitions);
140140
allFieldDefinitionsArray = allItems.ToArray();
141141
}
142+
143+
public bool IsRefField(FieldDefinition fieldDef)
144+
{
145+
return (fieldDef.Alias != null && IsRefField(fieldDef.Alias))
146+
|| IsRefField(fieldDef.Name);
147+
}
148+
149+
private bool IsRefField(string name)
150+
{
151+
return (Alias != null && Alias + "Id" == name)
152+
|| Name + "Id" == name;
153+
}
142154
}
143155

144156

src/ServiceStack.OrmLite/OrmLiteReadCommandExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -865,20 +865,20 @@ public static FieldDefinition GetRefFieldDefIfExists(this ModelDefinition modelD
865865
{
866866
var refField =
867867
refModelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == modelDef.ModelType
868-
&& (x.FieldName == modelDef.ModelName + "Id" || x.Name == modelDef.Name + "Id"))
868+
&& modelDef.IsRefField(x))
869869
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == modelDef.ModelType)
870-
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.FieldName == modelDef.ModelName + "Id")
871-
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.Name == modelDef.Name + "Id");
870+
?? refModelDef.FieldDefinitions.FirstOrDefault(modelDef.IsRefField);
871+
872872
return refField;
873873
}
874874

875875
public static FieldDefinition GetSelfRefFieldDefIfExists(this ModelDefinition modelDef, ModelDefinition refModelDef, FieldDefinition fieldDef)
876876
{
877877
var refField = (fieldDef == null ? null
878-
: modelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == refModelDef.ModelType && x.FieldName == fieldDef.FieldName + "Id"))
878+
: modelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == refModelDef.ModelType
879+
&& fieldDef.IsSelfRefField(x)))
879880
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == refModelDef.ModelType)
880-
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.FieldName == refModelDef.ModelName + "Id")
881-
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.Name == refModelDef.Name + "Id");
881+
?? modelDef.FieldDefinitions.FirstOrDefault(refModelDef.IsRefField);
882882

883883
return refField;
884884
}

src/ServiceStack.OrmLite/Support/LoadList.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,17 +179,17 @@ public void SetRefField(FieldDefinition fieldDef, Type refType)
179179
? modelDef.GetRefFieldDef(refModelDef, refType)
180180
: modelDef.GetRefFieldDefIfExists(refModelDef);
181181

182-
if (refField != null)
182+
if (refSelf != null)
183183
{
184-
var sqlRef = GetRefFieldSql(refModelDef, refField);
184+
var sqlRef = GetRefSelfSql(refSelf, refModelDef);
185185
var childResults = dbCmd.ConvertToList(refType, sqlRef);
186-
SetRefFieldChildResults(fieldDef, refField, childResults);
186+
SetRefSelfChildResults(fieldDef, refModelDef, refSelf, childResults);
187187
}
188-
else if (refSelf != null)
188+
else if (refField != null)
189189
{
190-
var sqlRef = GetRefSelfSql(refSelf, refModelDef);
190+
var sqlRef = GetRefFieldSql(refModelDef, refField);
191191
var childResults = dbCmd.ConvertToList(refType, sqlRef);
192-
SetRefSelfChildResults(fieldDef, refModelDef, refSelf, childResults);
192+
SetRefFieldChildResults(fieldDef, refField, childResults);
193193
}
194194
}
195195
}

tests/ServiceStack.OrmLite.Tests/Issues/MultiFieldReferenceTests.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,40 @@ public class Item
2828
public long GoalId { get; set; }
2929
}
3030

31+
public class AliasedCustomer
32+
{
33+
[AutoIncrement]
34+
public int Id { get; set; }
35+
public string Name { get; set; }
36+
37+
[Alias("_id_home_address")]
38+
[ForeignKey(typeof(AliasedCustomerAddress))]
39+
public int? HomeAddressId { get; set; }
40+
41+
[Alias("_id_work_address")]
42+
[ForeignKey(typeof(AliasedCustomerAddress))]
43+
public int? WorkAddressId { get; set; }
44+
45+
[Reference]
46+
public AliasedCustomerAddress HomeAddress { get; set; }
47+
48+
[Reference]
49+
public AliasedCustomerAddress WorkAddress { get; set; }
50+
}
51+
52+
public class AliasedCustomerAddress
53+
{
54+
[AutoIncrement]
55+
public int Id { get; set; }
56+
public int AliasedCustomerId { get; set; }
57+
public string AddressLine1 { get; set; }
58+
public string AddressLine2 { get; set; }
59+
public string City { get; set; }
60+
public string State { get; set; }
61+
public string Country { get; set; }
62+
}
63+
64+
3165
[TestFixture]
3266
public class MultiFieldReferenceTests
3367
: OrmLiteTestBase
@@ -67,5 +101,47 @@ public void Does_select_correct_reference_field()
67101
Assert.That(dbGoals.Items[1].GoalId, Is.EqualTo(goalWithItems.Id));
68102
}
69103
}
104+
105+
[Test]
106+
public void Does_fallback_to_reference_convention_when_alias_is_used()
107+
{
108+
using (var db = OpenDbConnection())
109+
{
110+
db.DropTable<AliasedCustomer>();
111+
db.DropTable<AliasedCustomerAddress>();
112+
db.CreateTable<AliasedCustomerAddress>();
113+
db.CreateTable<AliasedCustomer>();
114+
115+
var customer = new AliasedCustomer
116+
{
117+
Name = "Name",
118+
WorkAddress = new AliasedCustomerAddress
119+
{
120+
AddressLine1 = "1 Work Road",
121+
Country = "UK",
122+
},
123+
HomeAddress = new AliasedCustomerAddress
124+
{
125+
AddressLine1 = "2 Home Street",
126+
Country = "US",
127+
}
128+
};
129+
130+
db.Save(customer, references:true);
131+
132+
db.Select<AliasedCustomer>().PrintDump();
133+
db.Select<AliasedCustomerAddress>().PrintDump();
134+
135+
var dbCustomer = db.LoadSelect<AliasedCustomer>()[0];
136+
dbCustomer.PrintDump();
137+
138+
Assert.That(dbCustomer.Name, Is.EqualTo("Name"));
139+
Assert.That(dbCustomer.WorkAddress, Is.Not.Null);
140+
Assert.That(dbCustomer.WorkAddress.Country, Is.EqualTo("UK"));
141+
Assert.That(dbCustomer.HomeAddress, Is.Not.Null);
142+
Assert.That(dbCustomer.HomeAddress.Country, Is.EqualTo("US"));
143+
}
144+
}
145+
70146
}
71147
}

0 commit comments

Comments
 (0)