Skip to content

Commit b559451

Browse files
committed
Fixes: U4-5583 Can no longer link to Media Items from RTE in 6.2.3 - Due to a cherry pick/merge issue since the newer 7.x EntityRepository deals with NVarchar and NText values whereas the 6.x one did not. Have backported the mapping poco classes to now also support NVarchar and NText for the EntityRepository. Have also fixed the basic query to ensure that there are no left joins before inner joins which can also cause problems. Fixed up the duplicate where clause. Adds more tests to entity service.
1 parent 246dfba commit b559451

File tree

3 files changed

+67
-40
lines changed

3 files changed

+67
-40
lines changed

src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,13 @@ public UmbracoEntity BuildEntity(EntityRepository.UmbracoEntityDto dto)
9999
foreach (var propertyDto in dto.UmbracoPropertyDtos)
100100
{
101101
entity.UmbracoProperties.Add(new UmbracoEntity.UmbracoProperty
102-
{
103-
DataTypeControlId =
104-
propertyDto.DataTypeControlId,
105-
Value = propertyDto.UmbracoFile
106-
});
102+
{
103+
DataTypeControlId =
104+
propertyDto.DataTypeControlId,
105+
Value = propertyDto.NTextValue.IsNullOrWhiteSpace()
106+
? propertyDto.NVarcharValue
107+
: propertyDto.NTextValue
108+
});
107109
}
108110
}
109111

src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -193,18 +193,7 @@ private IEnumerable<IUmbracoEntity> PerformGetAll(Guid objectTypeId, Action<Sql>
193193

194194
public virtual IEnumerable<IUmbracoEntity> GetByQuery(IQuery<IUmbracoEntity> query)
195195
{
196-
//TODO: We need to fix all of this and how it handles parameters!
197-
198-
var wheres = query.GetWhereClauses().ToArray();
199-
200-
var sqlClause = GetBase(false, false, sql1 =>
201-
{
202-
//adds the additional filters
203-
foreach (var whereClause in wheres)
204-
{
205-
sql1.Where(whereClause.Item1, whereClause.Item2);
206-
}
207-
});
196+
var sqlClause = GetBase(false, false, null);
208197
var translator = new SqlTranslator<IUmbracoEntity>(sqlClause, query);
209198
var sql = translator.Translate().Append(GetGroupBy(false, false));
210199

@@ -222,17 +211,7 @@ public virtual IEnumerable<IUmbracoEntity> GetByQuery(IQuery<IUmbracoEntity> que
222211
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
223212
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
224213

225-
var wheres = query.GetWhereClauses().ToArray();
226-
227-
var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, sql1 =>
228-
{
229-
//adds the additional filters
230-
foreach (var whereClause in wheres)
231-
{
232-
sql1.Where(whereClause.Item1, whereClause.Item2);
233-
}
234-
235-
}, objectTypeId);
214+
var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, null, objectTypeId);
236215

237216
var translator = new SqlTranslator<IUmbracoEntity>(sqlClause, query);
238217
var entitySql = translator.Translate();
@@ -241,6 +220,8 @@ public virtual IEnumerable<IUmbracoEntity> GetByQuery(IQuery<IUmbracoEntity> que
241220

242221
if (isMedia)
243222
{
223+
var wheres = query.GetWhereClauses().ToArray();
224+
244225
var mediaSql = GetFullSqlForMedia(entitySql.Append(GetGroupBy(isContent, true, false)), sql =>
245226
{
246227
//adds the additional filters
@@ -259,7 +240,8 @@ public virtual IEnumerable<IUmbracoEntity> GetByQuery(IQuery<IUmbracoEntity> que
259240
else
260241
{
261242
//use dynamic so that we can get ALL properties from the SQL so we can chuck that data into our AdditionalData
262-
var dtos = _work.Database.Fetch<dynamic>(entitySql.Append(GetGroupBy(isContent, false)));
243+
var finalSql = entitySql.Append(GetGroupBy(isContent, false));
244+
var dtos = _work.Database.Fetch<dynamic>(finalSql);
263245
return dtos.Select(factory.BuildEntityFromDynamic).Cast<IUmbracoEntity>().ToList();
264246
}
265247
}
@@ -362,10 +344,8 @@ protected virtual Sql GetBase(bool isContent, bool isMedia, Action<Sql> customFi
362344

363345
var entitySql = new Sql()
364346
.Select(columns.ToArray())
365-
.From("umbracoNode umbracoNode")
366-
.LeftJoin("umbracoNode parent").On("parent.parentID = umbracoNode.id");
367-
368-
347+
.From("umbracoNode umbracoNode");
348+
369349
if (isContent || isMedia)
370350
{
371351
entitySql.InnerJoin("cmsContent content").On("content.nodeId = umbracoNode.id")
@@ -378,6 +358,8 @@ protected virtual Sql GetBase(bool isContent, bool isMedia, Action<Sql> customFi
378358
.On("umbracoNode.id = latest.nodeId");
379359
}
380360

361+
entitySql.LeftJoin("umbracoNode parent").On("parent.parentID = umbracoNode.id");
362+
381363
if (customFilter != null)
382364
{
383365
customFilter(entitySql);
@@ -510,10 +492,16 @@ internal class UmbracoPropertyDto
510492
[Column("controlId")]
511493
public Guid DataTypeControlId { get; set; }
512494

513-
[Column("umbracoFile")]
514-
public string UmbracoFile { get; set; }
515-
}
495+
[Column("propertyTypeAlias")]
496+
public string PropertyAlias { get; set; }
497+
498+
[Column("dataNvarchar")]
499+
public string NVarcharValue { get; set; }
516500

501+
[Column("dataNtext")]
502+
public string NTextValue { get; set; }
503+
}
504+
517505
/// <summary>
518506
/// This is a special relator in that it is not returning a DTO but a real resolved entity and that it accepts
519507
/// a dynamic instance.
@@ -546,7 +534,9 @@ internal UmbracoEntity Map(dynamic a, UmbracoPropertyDto p)
546534
Current.UmbracoProperties.Add(new UmbracoEntity.UmbracoProperty
547535
{
548536
DataTypeControlId = p.DataTypeControlId,
549-
Value = p.UmbracoFile
537+
Value = p.NTextValue.IsNullOrWhiteSpace()
538+
? p.NVarcharValue
539+
: p.NTextValue
550540
});
551541
// Return null to indicate we're not done with this UmbracoEntity yet
552542
return null;
@@ -568,7 +558,9 @@ internal UmbracoEntity Map(dynamic a, UmbracoPropertyDto p)
568558
new UmbracoEntity.UmbracoProperty
569559
{
570560
DataTypeControlId = p.DataTypeControlId,
571-
Value = p.UmbracoFile
561+
Value = p.NTextValue.IsNullOrWhiteSpace()
562+
? p.NVarcharValue
563+
: p.NTextValue
572564
}
573565
};
574566

src/Umbraco.Tests/Services/EntityServiceTests.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,30 @@ public void EntityService_Can_Get_Child_Content_By_ParentId_And_UmbracoObjectTyp
7676
Assert.That(entities.Any(x => x.Trashed), Is.False);
7777
}
7878

79+
[Test]
80+
public void EntityService_Can_Get_Children_By_ParentId()
81+
{
82+
var service = ServiceContext.EntityService;
83+
84+
var entities = service.GetChildren(folderId);
85+
86+
Assert.That(entities.Any(), Is.True);
87+
Assert.That(entities.Count(), Is.EqualTo(3));
88+
Assert.That(entities.Any(x => x.Trashed), Is.False);
89+
}
90+
91+
[Test]
92+
public void EntityService_Can_Get_Descendants_By_ParentId()
93+
{
94+
var service = ServiceContext.EntityService;
95+
96+
var entities = service.GetDescendents(folderId);
97+
98+
Assert.That(entities.Any(), Is.True);
99+
Assert.That(entities.Count(), Is.EqualTo(4));
100+
Assert.That(entities.Any(x => x.Trashed), Is.False);
101+
}
102+
79103
[Test]
80104
public void EntityService_Throws_When_Getting_All_With_Invalid_Type()
81105
{
@@ -129,7 +153,7 @@ public void EntityService_Can_Find_All_Media_By_UmbracoObjectTypes()
129153
var entities = service.GetAll(UmbracoObjectTypes.Media);
130154

131155
Assert.That(entities.Any(), Is.True);
132-
Assert.That(entities.Count(), Is.EqualTo(3));
156+
Assert.That(entities.Count(), Is.EqualTo(5));
133157
//Assert.That(entities.Any(x => ((UmbracoEntity)x).UmbracoFile != string.Empty), Is.True);
134158
Assert.That(
135159
entities.Any(
@@ -140,6 +164,8 @@ public void EntityService_Can_Find_All_Media_By_UmbracoObjectTypes()
140164

141165
private static bool _isSetup = false;
142166

167+
private int folderId;
168+
143169
public override void CreateTestData()
144170
{
145171
if (_isSetup == false)
@@ -150,8 +176,9 @@ public override void CreateTestData()
150176

151177
//Create and Save folder-Media -> 1050
152178
var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031);
153-
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
179+
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
154180
ServiceContext.MediaService.Save(folder, 0);
181+
folderId = folder.Id;
155182

156183
//Create and Save image-Media -> 1051
157184
var imageMediaType = ServiceContext.ContentTypeService.GetMediaType(1032);
@@ -162,6 +189,12 @@ public override void CreateTestData()
162189
var fileMediaType = ServiceContext.ContentTypeService.GetMediaType(1033);
163190
var file = MockedMedia.CreateMediaFile(fileMediaType, folder.Id);
164191
ServiceContext.MediaService.Save(file, 0);
192+
193+
var subfolder = MockedMedia.CreateMediaFolder(folderMediaType, folder.Id);
194+
ServiceContext.MediaService.Save(subfolder, 0);
195+
var subfolder2 = MockedMedia.CreateMediaFolder(folderMediaType, subfolder.Id);
196+
ServiceContext.MediaService.Save(subfolder2, 0);
197+
165198
}
166199

167200
}

0 commit comments

Comments
 (0)