diff --git a/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs index 367df0c41a..8d163abf44 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class ContentTypeDto { [Column("pk")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 535)] public int PrimaryKey { get; set; } [Column("nodeId")] diff --git a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs index 0b00980f55..4c832dc486 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Models.Rdbms public int Id { get; set; } [Column("ContentId")] - [ForeignKey(typeof(ContentDto))] + [ForeignKey(typeof(ContentDto), Column = "nodeId")] public int NodeId { get; set; } [Column("VersionId")] diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs index 0a820ea216..b6859ba0ad 100644 --- a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models.Rdbms internal class DataTypeDto { [Column("pk")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 39)] public int PrimaryKey { get; set; } [Column("nodeId")] diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs index 7546c6faef..e6666ea6f0 100644 --- a/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class DataTypePreValueDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 5)] public int Id { get; set; } [Column("datatypeNodeId")] diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs index d1fdc496a3..51b818437f 100644 --- a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models.Rdbms internal class DocumentDto { [Column("nodeId")] - [ForeignKey(typeof(ContentDto))] + [ForeignKey(typeof(ContentDto), Column = "nodeId")] [ForeignKey(typeof(NodeDto))] [Index(IndexTypes.UniqueNonClustered, Name = "IX_cmsDocument", ForColumns = "nodeId, versionId")] public int NodeId { get; set; } diff --git a/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs b/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs index 7599e48115..a634dca0a4 100644 --- a/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class LanguageDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 2)] public short Id { get; set; } [Column("languageISOCode")] diff --git a/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs index d1f926c230..3014f984e7 100644 --- a/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class MacroPropertyTypeDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 26)] public short Id { get; set; } [Column("macroPropertyTypeAlias")] diff --git a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs index a75a240311..abf1f01ca1 100644 --- a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs @@ -10,28 +10,23 @@ namespace Umbraco.Core.Models.Rdbms internal class NodeDto { [Column("id")] - [PrimaryKeyColumn(Name = "PK_structure")] - //[DatabaseType(DatabaseTypes.Integer)] + [PrimaryKeyColumn(Name = "PK_structure", IdentitySeed = 1045)] public int NodeId { get; set; } [Column("trashed")] - //[DatabaseType(DatabaseTypes.Bool)] [Constraint(Default = "0")] public bool Trashed { get; set; } [Column("parentID")] - //[DatabaseType(DatabaseTypes.Integer)] [ForeignKey(typeof(NodeDto))] [IndexAttribute(IndexTypes.NonClustered, Name = "IX_umbracoNodeParentId")] public int ParentId { get; set; } [Column("nodeUser")] - //[DatabaseType(DatabaseTypes.Integer)] [NullSetting(NullSetting = NullSettings.Null)] public int? UserId { get; set; } [Column("level")] - //[DatabaseType(DatabaseTypes.SmallInteger)] public short Level { get; set; } [Column("path")] @@ -39,27 +34,22 @@ namespace Umbraco.Core.Models.Rdbms public string Path { get; set; } [Column("sortOrder")] - //[DatabaseType(DatabaseTypes.Integer)] public int SortOrder { get; set; } [Column("uniqueID")] - //[DatabaseType(DatabaseTypes.UniqueIdentifier)] [NullSetting(NullSetting = NullSettings.Null)] public Guid? UniqueId { get; set; } [Column("text")] - //[DatabaseType(DatabaseTypes.Nvarchar, Length = 255)] [NullSetting(NullSetting = NullSettings.Null)] public string Text { get; set; } [Column("nodeObjectType")] - //[DatabaseType(DatabaseTypes.UniqueIdentifier)] [NullSetting(NullSetting = NullSettings.Null)] [IndexAttribute(IndexTypes.NonClustered, Name = "IX_umbracoNodeObjectType")] public Guid? NodeObjectType { get; set; } [Column("createDate")] - //[DatabaseType(DatabaseTypes.DateTime)] [Constraint(Default = "getdate()")] public DateTime CreateDate { get; set; } } diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs index ee973862af..f125c6eaf3 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs @@ -50,6 +50,7 @@ namespace Umbraco.Core.Models.Rdbms [ResultColumn] public PropertyTypeDto PropertyTypeDto { get; set; } + [Ignore] public object GetValue { get diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs index 8662284508..319251bb61 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class PropertyTypeDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 28)] public int Id { get; set; } [Column("dataTypeId")] diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs index 6a70e665e8..0bbf3a891f 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models.Rdbms internal class PropertyTypeGroupDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 6)] public int Id { get; set; } [Column("parentGroupId")] diff --git a/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs index fee220a60e..d3268a14fb 100644 --- a/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms internal class UserTypeDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(IdentitySeed = 5)] public short Id { get; set; } [Column("userTypeAlias")] diff --git a/src/Umbraco.Core/Persistence/DatabaseAnnotations/PrimaryKeyColumnAttribute.cs b/src/Umbraco.Core/Persistence/DatabaseAnnotations/PrimaryKeyColumnAttribute.cs index e71648eb2c..62db23e3cc 100644 --- a/src/Umbraco.Core/Persistence/DatabaseAnnotations/PrimaryKeyColumnAttribute.cs +++ b/src/Umbraco.Core/Persistence/DatabaseAnnotations/PrimaryKeyColumnAttribute.cs @@ -18,19 +18,19 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations } /// - /// Gets or sets a boolean indicating whether the primary key is clustered + /// Gets or sets a boolean indicating whether the primary key is clustered. /// /// Defaults to true public bool Clustered { get; set; } /// - /// Gets or sets a boolean indicating whether the primary key is auto incremented + /// Gets or sets a boolean indicating whether the primary key is auto incremented. /// /// Defaults to true public bool AutoIncrement { get; set; } /// - /// Gets or sets the name of the PrimaryKey + /// Gets or sets the name of the PrimaryKey. /// /// /// Overrides the default naming of a PrimaryKey constraint: @@ -39,12 +39,21 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations public string Name { get; set; } /// - /// Gets or sets the names of the columns for this PrimaryKey + /// Gets or sets the names of the columns for this PrimaryKey. /// /// /// Should only be used if the PrimaryKey spans over multiple columns. /// Usage: [nodeId], [otherColumn] /// public string OnColumns { get; set; } + + /// + /// Gets or sets the Identity Seed, which is used for Sql Ce databases. + /// + /// + /// We'll only look for changes to seeding and apply them if the configured database + /// is an Sql Ce database. + /// + public int IdentitySeed { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs index 5d0fbd4903..269acc6b44 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs @@ -85,6 +85,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoNode] ON ")); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -1, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1", SortOrder = 0, UniqueId = new Guid("916724a5-173d-4619-b97e-b9de133dd6f5"), Text = "SYSTEM DATA: umbraco master root", NodeObjectType = new Guid("ea7d8624-4cfe-4578-a871-24aa946bf34d"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -20, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1,-20", SortOrder = 0, UniqueId = new Guid("0F582A79-1E41-4CF0-BFA0-76340651891A"), Text = "Recycle Bin", NodeObjectType = new Guid("01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -21, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1,-21", SortOrder = 0, UniqueId = new Guid("BF7C7CBC-952F-4518-97A2-69E9C7B33842"), Text = "Recycle Bin", NodeObjectType = new Guid("CF3D8E34-1C1C-41e9-AE56-878B57B32113"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -92, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-92", SortOrder = 35, UniqueId = new Guid("f0bc4bfb-b499-40d6-ba86-058885a5178c"), Text = "Label", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -90, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-90", SortOrder = 34, UniqueId = new Guid("84c6b441-31df-4ffe-b67e-67d5bc3ae65a"), Text = "Upload", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -89, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-89", SortOrder = 33, UniqueId = new Guid("c6bac0dd-4ab9-45b1-8e30-e4b619ee5da3"), Text = "Textbox multiple", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); @@ -112,7 +113,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1041, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1041", SortOrder = 2, UniqueId = new Guid("b6b73142-b9c1-4bf8-a16d-e1c23320b549"), Text = "Tags", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1042, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1042", SortOrder = 2, UniqueId = new Guid("0a452bd5-83f9-4bc3-8403-1286e13fb77e"), Text = "Macro Container", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1043, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1043", SortOrder = 2, UniqueId = new Guid("1df9f033-e6d4-451f-b8d2-e0cbc50a836f"), Text = "Image Cropper", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoNode] OFF ")); + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoNode] OFF;")); transaction.Complete(); } @@ -131,7 +132,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial { _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoUser] ON ")); _database.Insert("umbracoUser", "id", false, new UserDto { Id = 0, Disabled = false, NoConsole = false, Type = 1, ContentStartId = -1, MediaStartId = -1, UserName = "Administrator", Login = "admin", Password = "default", Email = "", UserLanguage = "en", DefaultPermissions = null, DefaultToLiveEditing = false }); - _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoUser] OFF ")); + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoUser] OFF;")); transaction.Complete(); } @@ -139,9 +140,10 @@ namespace Umbraco.Core.Persistence.Migrations.Initial private void CreateUmbracoUserTypeData() { - _database.Insert(new UserTypeDto { Id = 1, Alias = "admin", Name = "Administrators", DefaultPermissions = "CADMOSKTPIURZ:" }); - _database.Insert(new UserTypeDto { Id = 2, Alias = "writer", Name = "Writer", DefaultPermissions = "CAH:" }); - _database.Insert(new UserTypeDto { Id = 3, Alias = "editor", Name = "Editors", DefaultPermissions = "CADMOSKTPUZ:" }); + _database.Insert(new UserTypeDto { Id = 1, Alias = "admin", Name = "Administrators", DefaultPermissions = "CADMOSKTPIURZ:5F" }); + _database.Insert(new UserTypeDto { Id = 2, Alias = "writer", Name = "Writer", DefaultPermissions = "CAH:F" }); + _database.Insert(new UserTypeDto { Id = 3, Alias = "editor", Name = "Editors", DefaultPermissions = "CADMOSKTPUZ:5F" }); + _database.Insert(new UserTypeDto { Id = 4, Alias = "translator", Name = "Translator", DefaultPermissions = "AF" }); } private void CreateUmbracoUser2AppData() @@ -183,7 +185,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1 }); _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 }); _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 }); - _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyTypeGroup] OFF ")); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyTypeGroup] OFF;")); transaction.Complete(); } @@ -203,7 +205,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoExtension", Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoBytes", Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyType] OFF ")); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyType] OFF;")); transaction.Complete(); } @@ -271,10 +273,42 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 38, DataTypeId = 1041, ControlId = new Guid("4023e540-92f5-11dd-ad8b-0800200c9a66"), DbType = "Ntext" }); _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 39, DataTypeId = 1042, ControlId = new Guid("474FCFF8-9D2D-11DE-ABC6-AD7A56D89593"), DbType = "Ntext" }); _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 40, DataTypeId = 1043, ControlId = new Guid("7A2D436C-34C2-410F-898F-4A23B3D79F54"), DbType = "Ntext" }); - _database.Execute(new Sql("SET IDENTITY_INSERT [cmsDataType] OFF ")); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsDataType] OFF;")); transaction.Complete(); } } + + private void CreateCmsDataTypePreValuesData() + {} + + private void CreateUmbracoRelationTypeData() + {} + + private void CreateCmsTaskTypeData() + { } + + /* + + * SET IDENTITY_INSERT [cmsDataTypePreValues] ON +insert into cmsDataTypePreValues (id, dataTypeNodeId, [value], sortorder, alias) +values (3,-87,',code,undo,redo,cut,copy,mcepasteword,stylepicker,bold,italic,bullist,numlist,outdent,indent,mcelink,unlink,mceinsertanchor,mceimage,umbracomacro,mceinserttable,umbracoembed,mcecharmap,' + char(124) + '1' + char(124) + '1,2,3,' + char(124) + '0' + char(124) + '500,400' + char(124) + '1049,' + char(124) + 'true' + char(124) + '', 0, '') + +insert into cmsDataTypePreValues (id, dataTypeNodeId, [value], sortorder, alias) +values (4,1041,'default', 0, 'group') + +SET IDENTITY_INSERT [cmsDataTypePreValues] OFF +; + + * + * + +insert into umbracoRelationType (dual, parentObjectType, childObjectType, name, alias) values (1, 'c66ba18e-eaf3-4cff-8a22-41b16d66a972', 'c66ba18e-eaf3-4cff-8a22-41b16d66a972', 'Relate Document On Copy','relateDocumentOnCopy') +; + * + * + + insert into cmsTaskType (alias) values ('toTranslate'); + */ } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index c409ddea3f..880f653a32 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -56,6 +56,7 @@ namespace Umbraco.Core.Persistence if (!tableExist) { + //Execute the Create Table sql int created = db.Execute(new Sql(createSql)); //Fires the NewTable event, which is used internally to insert base data before adding constrants to the schema @@ -65,17 +66,30 @@ namespace Umbraco.Core.Persistence NewTable(tableName, db, e); } + //If any statements exists for the primary key execute them here if(!string.IsNullOrEmpty(createPrimaryKeySql)) db.Execute(new Sql(createPrimaryKeySql)); + //Loop through foreignkey statements and execute sql foreach (var sql in foreignSql) { int createdFk = db.Execute(new Sql(sql)); } + //Loop through index statements and execute sql foreach (var sql in indexSql) { int createdIndex = db.Execute(new Sql(sql)); } + + //Specific to Sql Ce - look for changes to Identity Seed + if(DatabaseFactory.Current.DatabaseProvider == DatabaseProviders.SqlServerCE) + { + var seedSql = SyntaxConfig.SqlSyntaxProvider.ToAlterIdentitySeedStatements(tableDefinition); + foreach (var sql in seedSql) + { + int createdSeed = db.Execute(new Sql(sql)); + } + } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index f7659d0cf5..a2e72ffe57 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -173,15 +173,18 @@ namespace Umbraco.Core.Persistence.Repositories //Create the Content specific data - cmsContent var contentDto = dto.ContentVersionDto.ContentDto; + contentDto.NodeId = nodeDto.NodeId; Database.Insert(contentDto); //Create the first version - cmsContentVersion //Assumes a new Version guid and Version date (modified date) has been set var contentVersionDto = dto.ContentVersionDto; + contentVersionDto.NodeId = nodeDto.NodeId; Database.Insert(contentVersionDto); //Create the Document specific data for this version - cmsDocument //Assumes a new Version guid has been generated + dto.NodeId = nodeDto.NodeId; Database.Insert(dto); //Create the PropertyData for this version - cmsPropertyData diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs index ac99d6b9a8..1e58ef09cd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs @@ -76,6 +76,7 @@ namespace Umbraco.Core.Persistence.Repositories entity.Level = level; //Insert new ContentType entry + dto.NodeId = nodeDto.NodeId; Database.Insert(dto); //Insert ContentType composition in new table diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 9a5cab14ec..c5e117459f 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -25,5 +25,6 @@ namespace Umbraco.Core.Persistence.SqlSyntax string ToCreatePrimaryKeyStatement(TableDefinition table); string GetSpecialDbType(SpecialDbTypes dbTypes); string GetConstraintDefinition(ColumnDefinition column, string tableName); + List ToAlterIdentitySeedStatements(TableDefinition table); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/ColumnDefinition.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/ColumnDefinition.cs index a44e1d68d9..71e1826d8e 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/ColumnDefinition.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/ColumnDefinition.cs @@ -19,6 +19,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax.ModelDefinitions public bool IsPrimaryKeyClustered { get; set; } public string PrimaryKeyName { get; set; } public string PrimaryKeyColumns { get; set; } + public int PrimaryKeySeeding { get; set; } public string ConstraintName { get; set; } public string ConstraintDefaultValue { get; set; } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/DefinitionFactory.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/DefinitionFactory.cs index 959b3e7105..0d2af3679a 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/DefinitionFactory.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ModelDefinitions/DefinitionFactory.cs @@ -15,7 +15,11 @@ namespace Umbraco.Core.Persistence.SqlSyntax.ModelDefinitions var objProperties = modelType.GetProperties().ToList(); foreach (var propertyInfo in objProperties) { - //If current property is a ResultColumn then skip it + //If current property has an IgnoreAttribute then skip it + var ignoreAttribute = propertyInfo.FirstAttribute(); + if (ignoreAttribute != null) continue; + + //If current property has a ResultColumnAttribute then skip it var resultColumnAttribute = propertyInfo.FirstAttribute(); if (resultColumnAttribute != null) continue; @@ -61,6 +65,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax.ModelDefinitions columnDefinition.IsPrimaryKeyClustered = primaryKeyColumnAttribute.Clustered; columnDefinition.PrimaryKeyName = primaryKeyColumnAttribute.Name ?? string.Empty; columnDefinition.PrimaryKeyColumns = primaryKeyColumnAttribute.OnColumns ?? string.Empty; + columnDefinition.PrimaryKeySeeding = primaryKeyColumnAttribute.IdentitySeed; } //Look for Constraint for the current column diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index b7960830f3..ec0337d293 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -8,6 +8,13 @@ using Umbraco.Core.Persistence.SqlSyntax.ModelDefinitions; namespace Umbraco.Core.Persistence.SqlSyntax { + /// + /// Represents the Base Sql Syntax provider implementation. + /// + /// + /// All Sql Syntax provider implementations should derive from this abstract class. + /// + /// internal abstract class SqlSyntaxProviderBase : ISqlSyntaxProvider where TSyntax : ISqlSyntaxProvider { @@ -280,6 +287,24 @@ namespace Umbraco.Core.Persistence.SqlSyntax return indexes; } + public virtual List ToAlterIdentitySeedStatements(TableDefinition table) + { + var seeds = new List(); + + foreach (var definition in table.ColumnDefinitions) + { + if (definition.PrimaryKeySeeding > 0) + { + seeds.Add(string.Format("ALTER TABLE {0} ALTER COLUMN {1} IDENTITY({2},1); \n", + GetQuotedTableName(table.TableName), + GetQuotedColumnName(definition.ColumnName), + definition.PrimaryKeySeeding)); + } + } + + return seeds; + } + public virtual bool DoesTableExist(Database db, string tableName) { return false; diff --git a/src/Umbraco.Tests/ContentStores/PublishContentStoreTests.cs b/src/Umbraco.Tests/ContentStores/PublishContentStoreTests.cs index 26594a57da..be70bd007f 100644 --- a/src/Umbraco.Tests/ContentStores/PublishContentStoreTests.cs +++ b/src/Umbraco.Tests/ContentStores/PublishContentStoreTests.cs @@ -5,6 +5,7 @@ using Umbraco.Core; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Routing; +using Umbraco.Web.Services; using umbraco.BusinessLogic; namespace Umbraco.Tests.ContentStores @@ -70,6 +71,8 @@ namespace Umbraco.Tests.ContentStores _umbracoContext = new UmbracoContext(_httpContextFactory.HttpContext, new ApplicationContext(), + ServiceContext.Current, + DatabaseContext.Current, new DefaultRoutesCache(false)); _umbracoContext.GetXmlDelegate = () => diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 33067a71ad..e43f269a11 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -2,6 +2,8 @@ using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.TestHelpers.Entities; +using Umbraco.Web; using Umbraco.Web.Services; namespace Umbraco.Tests.Services @@ -13,7 +15,7 @@ namespace Umbraco.Tests.Services public void Can_Create_Content() { // Arrange - var contentService = GetUmbracoContext("/test", 1234).Services.ContentService; + var contentService = ServiceContext.ContentService; // Act IContent content = contentService.CreateContent(-1, "umbTextpage"); @@ -23,11 +25,11 @@ namespace Umbraco.Tests.Services Assert.That(content.HasIdentity, Is.False); } - /*[Test]*/ + [Test] public void Cannot_Create_Content_With_Non_Existing_ContentType_Alias() { // Arrange - var contentService = new ContentService(); + var contentService = ServiceContext.ContentService; // Act & Assert Assert.Throws(() => contentService.CreateContent(-1, "umbAliasDoesntExist")); @@ -95,5 +97,32 @@ namespace Umbraco.Tests.Services public void Can_Rollback_Version_On_Content() { } + + public override void CreateTestData() + { + //NOTE Maybe not the best way to create/save test data as we are using the services, which are being tested. + + //Create and Save ContentType "umbTextpage" + ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); + ServiceContext.ContentTypeService.Save(contentType); + + //Create and Save Content "Homepage" based on "umbTextpage" + Content textpage = MockedContent.CreateTextpageContent(contentType); + ServiceContext.ContentService.Save(textpage, 0); + + //Create and Save Content "Text Page 1" based on "umbTextpage" + Content subpage = MockedContent.CreateTextpageContent(contentType, "Text Page 1", textpage.Id); + ServiceContext.ContentService.Save(subpage, 0); + } + + private UmbracoContext UmbracoContext + { + get { return GetUmbracoContext("/test", 1234); } + } + + private ServiceContext ServiceContext + { + get { return UmbracoContext.Services; } + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 859d2a45c5..c06a1c7039 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Tests.Stubs; using Umbraco.Web; using Umbraco.Web.Routing; +using Umbraco.Web.Services; using umbraco.BusinessLogic; namespace Umbraco.Tests.TestHelpers @@ -27,11 +28,16 @@ namespace Umbraco.Tests.TestHelpers [SetUp] public virtual void Initialize() { + TestHelper.SetupLog4NetForTests(); + string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); Resolution.Freeze(); ApplicationContext = new ApplicationContext() { IsReady = true }; + ServiceContext = ServiceContext.Current; + DatabaseContext = DatabaseContext.Current; + //we need to clear out all currently created template files var masterPages = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Masterpages)); masterPages.GetFiles().ForEach(x => x.Delete()); @@ -56,21 +62,44 @@ namespace Umbraco.Tests.TestHelpers //Create the umbraco database DatabaseFactory.Current.Database.Initialize(); + + CreateTestData(); } [TearDown] public virtual void TearDown() { + //reset the app context + ServiceContext = null; + DatabaseContext = null; + ApplicationContext.Current = null; + Resolution.IsFrozen = false; + + string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", null); + + string filePath = string.Concat(path, "\\test.sdf"); + if (File.Exists(filePath)) + { + File.Delete(filePath); + } } + public abstract void CreateTestData(); + protected ApplicationContext ApplicationContext { get; private set; } + protected ServiceContext ServiceContext { get; private set; } + + protected DatabaseContext DatabaseContext { get; private set; } + protected UmbracoContext GetUmbracoContext(string url, int templateId, RouteData routeData = null) { var ctx = new UmbracoContext( GetHttpContextFactory(url, routeData).HttpContext, ApplicationContext, + ServiceContext, + DatabaseContext, GetRoutesCache()); SetupUmbracoContextForTest(ctx, templateId); return ctx; diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index 4cb5ad9c11..aab970ea39 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -9,6 +9,7 @@ using Umbraco.Core.ObjectResolution; using Umbraco.Tests.Stubs; using Umbraco.Web; using Umbraco.Web.Routing; +using Umbraco.Web.Services; using umbraco.BusinessLogic; using umbraco.cms.businesslogic.cache; using umbraco.cms.businesslogic.template; @@ -30,6 +31,8 @@ namespace Umbraco.Tests.TestHelpers TestHelper.InitializeDatabase(); Resolution.Freeze(); ApplicationContext = new ApplicationContext() { IsReady = true }; + ServiceContext = ServiceContext.Current; + DatabaseContext = DatabaseContext.Current; //we need to clear out all currently created template files var masterPages = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Masterpages)); masterPages.GetFiles().ForEach(x => x.Delete()); @@ -42,6 +45,8 @@ namespace Umbraco.Tests.TestHelpers { //reset the app context ApplicationContext.Current = null; + ServiceContext = null; + DatabaseContext = null; Resolution.IsFrozen = false; if (RequiresDbSetup) TestHelper.ClearDatabase(); @@ -74,6 +79,10 @@ namespace Umbraco.Tests.TestHelpers protected ApplicationContext ApplicationContext { get; private set; } + protected ServiceContext ServiceContext { get; private set; } + + protected DatabaseContext DatabaseContext { get; private set; } + internal virtual IRoutesCache GetRoutesCache() { return new FakeRoutesCache(); @@ -84,6 +93,8 @@ namespace Umbraco.Tests.TestHelpers var ctx = new UmbracoContext( GetHttpContextFactory(url, routeData).HttpContext, ApplicationContext, + ServiceContext, + DatabaseContext, GetRoutesCache()); SetupUmbracoContextForTest(ctx, templateId); return ctx; diff --git a/src/Umbraco.Tests/TestHelpers/Entities/MockedContent.cs b/src/Umbraco.Tests/TestHelpers/Entities/MockedContent.cs index 5c0cce4697..01ed04b128 100644 --- a/src/Umbraco.Tests/TestHelpers/Entities/MockedContent.cs +++ b/src/Umbraco.Tests/TestHelpers/Entities/MockedContent.cs @@ -12,13 +12,28 @@ namespace Umbraco.Tests.TestHelpers.Entities { title = "Welcome to our Home page", bodyText = "This is the welcome message on the first page", - keywords = "text,home,page", - metaDescription = "The Lorem Ipsum company" + author = "John Doe" }; content.PropertyValues(obj); return content; } + + public static Content CreateTextpageContent(ContentType contentType, string name, int parentId) + { + var content = new Content(parentId, contentType) { Name = name, Language = "en-US", ParentId = parentId, Template = "~/masterpages/umbTextPage.master", UserId = 0 }; + object obj = + new + { + title = name + " Subpage", + bodyText = "This is a subpage", + author = "John Doe" + }; + + content.PropertyValues(obj); + + return content; + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index 695a04a774..c1075145fb 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -34,15 +34,19 @@ namespace Umbraco.Web /// private static UmbracoContext _umbracoContext; - /// - /// Creates a new Umbraco context. - /// - /// - /// - /// - internal UmbracoContext( + /// + /// Creates a new Umbraco context. + /// + /// + /// + /// + /// + /// + internal UmbracoContext( HttpContextBase httpContext, ApplicationContext applicationContext, + ServiceContext serviceContext, + DatabaseContext databaseContext, IRoutesCache routesCache) { if (httpContext == null) throw new ArgumentNullException("httpContext"); @@ -52,9 +56,8 @@ namespace Umbraco.Web Application = applicationContext; RoutesCache = routesCache; - //Consider moving these two contexts to the constructor for proper DI - Services = ServiceContext.Current; - DatabaseContext = DatabaseContext.Current; + Services = serviceContext; + DatabaseContext = databaseContext; // set the urls... //original request url diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index 4b3367ef07..c704471c66 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -12,6 +12,7 @@ using System.Web.UI; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Web.Routing; +using Umbraco.Web.Services; using umbraco; using umbraco.IO; using GlobalSettings = Umbraco.Core.Configuration.GlobalSettings; @@ -50,6 +51,8 @@ namespace Umbraco.Web var umbracoContext = new UmbracoContext( httpContext, ApplicationContext.Current, + ServiceContext.Current, + DatabaseContext.Current, RoutesCacheResolver.Current.RoutesCache); UmbracoContext.Current = umbracoContext;