diff --git a/src/Umbraco.Core/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs
index 3f9974166c..8edc552012 100644
--- a/src/Umbraco.Core/Constants-ObjectTypes.cs
+++ b/src/Umbraco.Core/Constants-ObjectTypes.cs
@@ -152,6 +152,16 @@ namespace Umbraco.Core
/// Guid for a Lock object.
///
public static readonly Guid LockObjectGuid = new Guid(LockObject);
+
+ ///
+ /// Guid for a relation type.
+ ///
+ public const string RelationType = "B1988FAD-8675-4F47-915A-B3A602BC5D8D";
+
+ ///
+ /// Guid for a relation type.
+ ///
+ public static readonly Guid RelationTypeGuid = new Guid(RelationType);
}
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
index 8a6eb5c02a..54052f58a3 100644
--- a/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
@@ -15,6 +15,10 @@ namespace Umbraco.Core.Models.Rdbms
[PrimaryKeyColumn(IdentitySeed = NodeIdSeed)]
public int Id { get; set; }
+ [Column("typeUniqueId")]
+ [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelationType_UniqueId")]
+ public Guid UniqueId { get; set; }
+
[Column("dual")]
public bool Dual { get; set; }
diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
index 2be2010301..3909af2a55 100644
--- a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
+++ b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
@@ -130,8 +130,13 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.DataTypeContainer)]
[FriendlyName("Data Type Container")]
- DataTypeContainer
-
+ DataTypeContainer,
+ ///
+ /// Relation type
+ ///
+ [UmbracoObjectType(Constants.ObjectTypes.RelationType)]
+ [FriendlyName("Relation Type")]
+ RelationType
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs
index 98d4f30042..b112535817 100644
--- a/src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs
+++ b/src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs
@@ -16,6 +16,7 @@ namespace Umbraco.Core.Persistence.Factories
entity.DisableChangeTracking();
entity.Id = dto.Id;
+ entity.Key = dto.UniqueId;
entity.IsBidirectional = dto.Dual;
entity.Name = dto.Name;
@@ -38,10 +39,13 @@ namespace Umbraco.Core.Persistence.Factories
ChildObjectType = entity.ChildObjectType,
Dual = entity.IsBidirectional,
Name = entity.Name,
- ParentObjectType = entity.ParentObjectType
+ ParentObjectType = entity.ParentObjectType,
+ UniqueId = entity.Key
};
if (entity.HasIdentity)
+ {
dto.Id = entity.Id;
+ }
return dto;
}
diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs
index 6128096943..9b5d2bc2c8 100644
--- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs
+++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs
@@ -292,8 +292,12 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
private void CreateUmbracoRelationTypeData()
{
- _database.Insert("umbracoRelationType", "id", false, new RelationTypeDto { Id = 1, Alias = Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias, ChildObjectType = new Guid(Constants.ObjectTypes.Document), ParentObjectType = new Guid(Constants.ObjectTypes.Document), Dual = true, Name = Constants.Conventions.RelationTypes.RelateDocumentOnCopyName });
- _database.Insert("umbracoRelationType", "id", false, new RelationTypeDto { Id = 2, Alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias, ChildObjectType = new Guid(Constants.ObjectTypes.Document), ParentObjectType = new Guid(Constants.ObjectTypes.Document), Dual = false, Name = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteName });
+ var relationType = new RelationTypeDto { Id = 1, Alias = Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias, ChildObjectType = new Guid(Constants.ObjectTypes.Document), ParentObjectType = new Guid(Constants.ObjectTypes.Document), Dual = true, Name = Constants.Conventions.RelationTypes.RelateDocumentOnCopyName };
+ relationType.UniqueId = (relationType.Alias + "____" + relationType.Name).ToGuid();
+ _database.Insert("umbracoRelationType", "id", false, relationType);
+ relationType = new RelationTypeDto { Id = 2, Alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias, ChildObjectType = new Guid(Constants.ObjectTypes.Document), ParentObjectType = new Guid(Constants.ObjectTypes.Document), Dual = false, Name = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteName };
+ relationType.UniqueId = (relationType.Alias + "____" + relationType.Name).ToGuid();
+ _database.Insert("umbracoRelationType", "id", false, relationType);
}
private void CreateCmsTaskTypeData()
diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs
new file mode 100644
index 0000000000..8a6641c523
--- /dev/null
+++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Linq;
+using Umbraco.Core.Configuration;
+using Umbraco.Core.Logging;
+using Umbraco.Core.Persistence.SqlSyntax;
+
+namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenSixZero
+{
+ [Migration("7.6.0", 0, GlobalSettings.UmbracoMigrationName)]
+ public class AddRelationTypeUniqueIdColumn : MigrationBase
+ {
+ public AddRelationTypeUniqueIdColumn(ISqlSyntaxProvider sqlSyntax, ILogger logger)
+ : base(sqlSyntax, logger)
+ { }
+
+ public override void Up()
+ {
+ var columns = SqlSyntax.GetColumnsInSchema(Context.Database).ToArray();
+
+ if (columns.Any(x => x.TableName.InvariantEquals("umbracoRelationType") && x.ColumnName.InvariantEquals("typeUniqueId")) == false)
+ {
+ Create.Column("typeUniqueId").OnTable("umbracoRelationType").AsGuid().Nullable();
+ Execute.Code(UpdateRelationTypeGuids);
+ Alter.Table("umbracoRelationType").AlterColumn("typeUniqueId").AsGuid().NotNullable();
+ Create.Index("IX_umbracoRelationType_UniqueId").OnTable("umbracoRelationType").OnColumn("typeUniqueId")
+ .Ascending()
+ .WithOptions().NonClustered()
+ .WithOptions().Unique();
+ }
+ }
+
+ private static string UpdateRelationTypeGuids(Database database)
+ {
+ var updates = database.Query("SELECT id, alias, name FROM umbracoRelationType")
+ .Select(relationType => Tuple.Create((int) relationType.id, ((string) relationType.alias + "____" + (string) relationType.name).ToGuid()))
+ .ToList();
+
+ foreach (var update in updates)
+ database.Execute("UPDATE umbracoRelationType set typeUniqueId=@guid WHERE id=@id", new { guid = update.Item2, id = update.Item1 });
+
+ return string.Empty;
+ }
+
+ public override void Down()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRelationTypeRepository.cs
index d28f81bce0..0cf6357d24 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRelationTypeRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRelationTypeRepository.cs
@@ -1,9 +1,8 @@
-using Umbraco.Core.Models;
+using System;
+using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
- public interface IRelationTypeRepository : IRepositoryQueryable
- {
-
- }
+ public interface IRelationTypeRepository : IRepositoryQueryable, IReadRepository
+ { }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs
index c0a110feca..2c54897ff7 100644
--- a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs
@@ -44,6 +44,17 @@ namespace Umbraco.Core.Persistence.Repositories
return GetAll().FirstOrDefault(x => x.Id == id);
}
+ public IRelationType Get(Guid id)
+ {
+ // use the underlying GetAll which will force cache all content types
+ return GetAll().FirstOrDefault(x => x.Key == id);
+ }
+
+ public bool Exists(Guid id)
+ {
+ return Get(id) != null;
+ }
+
protected override IEnumerable PerformGetAll(params int[] ids)
{
var sql = GetBaseQuery(false);
@@ -57,6 +68,15 @@ namespace Umbraco.Core.Persistence.Repositories
return dtos.Select(x => DtoToEntity(x, factory));
}
+ public IEnumerable GetAll(params Guid[] ids)
+ {
+ // should not happen due to the cache policy
+ if (ids.Any())
+ throw new NotImplementedException();
+
+ return GetAll(new int[0]);
+ }
+
protected override IEnumerable PerformGetByQuery(IQuery query)
{
var sqlClause = GetBaseQuery(false);
diff --git a/src/Umbraco.Core/Services/IRelationService.cs b/src/Umbraco.Core/Services/IRelationService.cs
index 3719993a75..5fb1f3c8cc 100644
--- a/src/Umbraco.Core/Services/IRelationService.cs
+++ b/src/Umbraco.Core/Services/IRelationService.cs
@@ -21,6 +21,13 @@ namespace Umbraco.Core.Services
/// A object
IRelationType GetRelationTypeById(int id);
+ ///
+ /// Gets a by its Id
+ ///
+ /// Id of the
+ /// A object
+ IRelationType GetRelationTypeById(Guid id);
+
///
/// Gets a by its Alias
///
diff --git a/src/Umbraco.Core/Services/RelationService.cs b/src/Umbraco.Core/Services/RelationService.cs
index b4a37fc1d1..69f79e756e 100644
--- a/src/Umbraco.Core/Services/RelationService.cs
+++ b/src/Umbraco.Core/Services/RelationService.cs
@@ -48,6 +48,19 @@ namespace Umbraco.Core.Services
}
}
+ ///
+ /// Gets a by its Id
+ ///
+ /// Id of the
+ /// A object
+ public IRelationType GetRelationTypeById(Guid id)
+ {
+ using (var repository = RepositoryFactory.CreateRelationTypeRepository(UowProvider.GetUnitOfWork()))
+ {
+ return repository.Get(id);
+ }
+ }
+
///
/// Gets a by its Alias
///
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index c128051bfd..0741470f51 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -438,6 +438,7 @@
+