diff --git a/src/Umbraco.Core/Models/Rdbms/ContentDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentDto.cs index 1607df2d10..adbfed3ab0 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentDto.cs @@ -10,17 +10,14 @@ namespace Umbraco.Core.Models.Rdbms { [Column("pk")] [PrimaryKeyColumn] - [NullSetting(NullSetting = NullSettings.Null)] public int PrimaryKey { get; set; } [Column("nodeId")] [ForeignKey(typeof(NodeDto))] - [NullSetting(NullSetting = NullSettings.Null)] [Index(IndexTypes.UniqueNonClustered, Name = "IX_cmsContent")] public int NodeId { get; set; } [Column("contentType")] - [NullSetting(NullSetting = NullSettings.Null)] public int ContentType { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs index 08453d0f1d..0b00980f55 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,15 +10,19 @@ namespace Umbraco.Core.Models.Rdbms internal class ContentVersionDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("ContentId")] + [ForeignKey(typeof(ContentDto))] public int NodeId { get; set; } [Column("VersionId")] + [Index(IndexTypes.UniqueNonClustered)] public Guid VersionId { get; set; } [Column("VersionDate")] + [Constraint(Default = "getdate()")] public DateTime VersionDate { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs index 2923bd4289..f6487a8fb3 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,6 +9,8 @@ namespace Umbraco.Core.Models.Rdbms internal class ContentXmlDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false)] + [ForeignKey(typeof(ContentDto))] public int NodeId { get; set; } [Column("xml")] diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs index 2185140514..8e619b45fa 100644 --- a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,15 +10,19 @@ namespace Umbraco.Core.Models.Rdbms internal class DataTypeDto { [Column("pk")] + [PrimaryKeyColumn] public int PrimaryKey { get; set; } [Column("nodeId")] + [ForeignKey(typeof(NodeDto))] + [Index(IndexTypes.UniqueNonClustered)] public int DataTypeId { get; set; } [Column("controlId")] public Guid ControlId { get; set; } [Column("dbType")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)]//NOTE Is set to [varchar] (50) in Sql Server script public string DbType { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs index 5db67b9a7b..b84a15c454 100644 --- a/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,18 +9,24 @@ namespace Umbraco.Core.Models.Rdbms internal class DataTypePreValueDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("datatypeNodeId")] + [ForeignKey(typeof(DataTypeDto))] public int DataTypeNodeId { get; set; } [Column("value")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 2500)] public string Value { get; set; } [Column("sortorder")] public int SortOrder { get; set; } [Column("alias")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string Alias { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs b/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs index 8bf635df82..3411fa95df 100644 --- a/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -10,15 +11,18 @@ namespace Umbraco.Core.Models.Rdbms internal class DictionaryDto { [Column("pk")] + [PrimaryKeyColumn] public int PrimaryKey { get; set; } [Column("id")] + [Index(IndexTypes.UniqueNonClustered)] public Guid Id { get; set; } [Column("parent")] public Guid Parent { get; set; } [Column("key")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] public string Key { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs index 0ce3da0836..d4a2dadd8b 100644 --- a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,6 +10,9 @@ namespace Umbraco.Core.Models.Rdbms internal class DocumentDto { [Column("nodeId")] + [ForeignKey(typeof(ContentDto))] + [ForeignKey(typeof(NodeDto))] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_cmsDocument", ForColumns = "[nodeId], [versionId]")] public int NodeId { get; set; } [Column("published")] @@ -18,27 +22,37 @@ namespace Umbraco.Core.Models.Rdbms public int UserId { get; set; } [Column("versionId")] + [PrimaryKeyColumn(AutoIncrement = false)] public Guid VersionId { get; set; } [Column("text")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 255)] public string Text { get; set; } [Column("releaseDate")] + [NullSetting(NullSetting = NullSettings.Null)] public DateTime? ReleaseDate { get; set; } [Column("expireDate")] + [NullSetting(NullSetting = NullSettings.Null)] public DateTime? ExpiresDate { get; set; } [Column("updateDate")] + [Constraint(Default = "getdate()")] public DateTime UpdateDate { get; set; } [Column("templateId")] + [NullSetting(NullSetting = NullSettings.Null)] + [ForeignKey(typeof(TemplateDto))] public int? TemplateId { get; set; } [Column("alias")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 255)] public string Alias { get; set; } [Column("newest")] + [Constraint(Default = "0")] public bool Newest { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs index d5d0c824ac..1f6af49cba 100644 --- a/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,12 +9,17 @@ namespace Umbraco.Core.Models.Rdbms internal class DocumentTypeDto { [Column("contentTypeNodeId")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "[contentTypeNodeId], [templateNodeId]")] + [ForeignKey(typeof(ContentTypeDto))] + [ForeignKey(typeof(NodeDto))] public int ContentTypeNodeId { get; set; } [Column("templateNodeId")] + [ForeignKey(typeof(TemplateDto))] public int TemplateNodeId { get; set; } [Column("IsDefault")] + [Constraint(Default = "0")] public bool IsDefault { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/DomainDto.cs b/src/Umbraco.Core/Models/Rdbms/DomainDto.cs index c5d2ef5732..bd0bbc859c 100644 --- a/src/Umbraco.Core/Models/Rdbms/DomainDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DomainDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,12 +9,16 @@ namespace Umbraco.Core.Models.Rdbms internal class DomainDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } - [Column("omainDefaultLanguage")] + [Column("domainDefaultLanguage")] + [NullSetting(NullSetting = NullSettings.Null)] public int? DefaultLanguage { get; set; } [Column("domainRootStructureID")] + [NullSetting(NullSetting = NullSettings.Null)] + [ForeignKey(typeof(NodeDto))] public int? RootStructureId { get; set; } [Column("domainName")] diff --git a/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs b/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs index caa568eaa7..293cd1b826 100644 --- a/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,12 +9,18 @@ namespace Umbraco.Core.Models.Rdbms internal class LanguageDto { [Column("id")] + [PrimaryKeyColumn] public short Id { get; set; } [Column("languageISOCode")] + [Index(IndexTypes.UniqueNonClustered)] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 10)] public string IsoCode { get; set; } [Column("languageCultureName")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 100)] public string CultureName { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs b/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs index 940ef35d07..dc8863440d 100644 --- a/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,15 +10,18 @@ namespace Umbraco.Core.Models.Rdbms internal class LanguageTextDto { [Column("pk")] + [PrimaryKeyColumn] public int PrimaryKey { get; set; } [Column("languageId")] public int LanguageId { get; set; } [Column("UniqueId")] + [ForeignKey(typeof(DictionaryDto), Column = "id")] public Guid UniqueId { get; set; } [Column("value")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] public string Value { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/LogDto.cs b/src/Umbraco.Core/Models/Rdbms/LogDto.cs index 51070f5fd3..21f957425a 100644 --- a/src/Umbraco.Core/Models/Rdbms/LogDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/LogDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,21 +10,27 @@ namespace Umbraco.Core.Models.Rdbms internal class LogDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("userId")] public int UserId { get; set; } [Column("NodeId")] + [Index(IndexTypes.NonClustered, Name = "IX_umbracoLog")] public int NodeId { get; set; } [Column("Datestamp")] + [Constraint(Default = "getdate()")] public DateTime Datestamp { get; set; } [Column("logHeader")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string Header { get; set; } [Column("logComment")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 4000)] public string Comment { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/MacroDto.cs b/src/Umbraco.Core/Models/Rdbms/MacroDto.cs index c3417b3513..c3c0c1d525 100644 --- a/src/Umbraco.Core/Models/Rdbms/MacroDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MacroDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,39 +9,50 @@ namespace Umbraco.Core.Models.Rdbms internal class MacroDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("macroUseInEditor")] + [Constraint(Default = "0")] public bool UseInEditor { get; set; } [Column("macroRefreshRate")] + [Constraint(Default = "0")] public int RefreshRate { get; set; } [Column("macroAlias")] public string Alias { get; set; } [Column("macroName")] + [NullSetting(NullSetting = NullSettings.Null)] public string Name { get; set; } [Column("macroScriptType")] + [NullSetting(NullSetting = NullSettings.Null)] public string ScriptType { get; set; } [Column("macroScriptAssembly")] + [NullSetting(NullSetting = NullSettings.Null)] public string ScriptAssembly { get; set; } [Column("macroXSLT")] + [NullSetting(NullSetting = NullSettings.Null)] public string Xslt { get; set; } [Column("macroCacheByPage")] + [Constraint(Default = "1")] public bool CacheByPage { get; set; } [Column("macroCachePersonalized")] + [Constraint(Default = "0")] public bool CachePersonalized { get; set; } [Column("macroDontRender")] + [Constraint(Default = "0")] public bool DontRender { get; set; } [Column("macroPython")] + [NullSetting(NullSetting = NullSettings.Null)] public string Python { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/MacroPropertyDto.cs b/src/Umbraco.Core/Models/Rdbms/MacroPropertyDto.cs index 664cd57553..837402df4b 100644 --- a/src/Umbraco.Core/Models/Rdbms/MacroPropertyDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MacroPropertyDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,21 +9,27 @@ namespace Umbraco.Core.Models.Rdbms internal class MacroPropertyDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("macroPropertyHidden")] + [Constraint(Default = "0")] public bool Hidden { get; set; } [Column("macroPropertyType")] + [ForeignKey(typeof(MacroPropertyTypeDto))] public short Type { get; set; } [Column("macro")] + [ForeignKey(typeof(MacroDto))] public int Macro { get; set; } [Column("macroPropertySortOrder")] + [Constraint(Default = "0")] public byte SortOrder { get; set; } [Column("macroPropertyAlias")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string Alias { get; set; } [Column("macroPropertyName")] diff --git a/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs index 05222d5134..84b2ce2158 100644 --- a/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MacroPropertyTypeDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,18 +9,24 @@ namespace Umbraco.Core.Models.Rdbms internal class MacroPropertyTypeDto { [Column("id")] + [PrimaryKeyColumn] public short Id { get; set; } [Column("macroPropertyTypeAlias")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] + [NullSetting(NullSetting = NullSettings.Null)] public string Alias { get; set; } [Column("macroPropertyTypeRenderAssembly")] + [NullSetting(NullSetting = NullSettings.Null)] public string RenderAssembly { get; set; } [Column("macroPropertyTypeRenderType")] + [NullSetting(NullSetting = NullSettings.Null)] public string RenderType { get; set; } [Column("macroPropertyTypeBaseType")] + [NullSetting(NullSetting = NullSettings.Null)] public string BaseType { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs index 71d69573d2..89e07c25ea 100644 --- a/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -7,10 +8,13 @@ namespace Umbraco.Core.Models.Rdbms [ExplicitColumns] internal class Member2MemberGroupDto { - [Column("Memeber")] + [Column("Member")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsMember2MemberGroup", OnColumns = "[Member], [MemberGroup]")] + [ForeignKey(typeof(MemberDto))] public int Member { get; set; } [Column("MemberGroup")] + [ForeignKey(typeof(NodeDto))] public int MemberGroup { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/MemberDto.cs b/src/Umbraco.Core/Models/Rdbms/MemberDto.cs index 63ab831a51..8d246cfcad 100644 --- a/src/Umbraco.Core/Models/Rdbms/MemberDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MemberDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,15 +9,24 @@ namespace Umbraco.Core.Models.Rdbms internal class MemberDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false)] + [ForeignKey(typeof(ContentDto), Column = "nodeId")] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("Email")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] + [Constraint(Default = "''")] public string Email { get; set; } [Column("LoginName")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] + [Constraint(Default = "''")] public string LoginName { get; set; } [Column("Password")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] + [Constraint(Default = "''")] public string Password { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/MemberTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/MemberTypeDto.cs index 4d7c80d925..c9432652af 100644 --- a/src/Umbraco.Core/Models/Rdbms/MemberTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/MemberTypeDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,18 +9,23 @@ namespace Umbraco.Core.Models.Rdbms internal class MemberTypeDto { [Column("pk")] + [PrimaryKeyColumn] public int PrimaryKey { get; set; } [Column("NodeId")] + [ForeignKey(typeof(NodeDto))] + [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] public int NodeId { get; set; } [Column("propertytypeId")] public int PropertyTypeId { get; set; } [Column("memberCanEdit")] + [Constraint(Default = "0")] public bool CanEdit { get; set; } [Column("viewOnProfile")] + [Constraint(Default = "0")] public bool ViewOnProfile { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs b/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs index 7f0c4fdc2a..85ae2e38ac 100644 --- a/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,15 +10,19 @@ namespace Umbraco.Core.Models.Rdbms internal class PreviewXmlDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "", OnColumns = "[nodeId], [versionId]")] + [ForeignKey(typeof(ContentDto), Column = "nodeId")] public int NodeId { get; set; } [Column("versionId")] + [ForeignKey(typeof(ContentVersionDto), Column = "VersionId")] public Guid VersionId { get; set; } [Column("timestamp")] public DateTime Timestamp { get; set; } [Column("xml")] + [DatabaseType(DatabaseTypes.Ntext)] public string Xml { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs index 04f7fb8e58..ab9fff4fb7 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,27 +10,41 @@ namespace Umbraco.Core.Models.Rdbms internal class PropertyDataDto { [Column("id")] + [PrimaryKeyColumn] + [Index(IndexTypes.NonClustered, Name = "IX_cmsPropertyData")] public int Id { get; set; } [Column("contentNodeId")] + [ForeignKey(typeof(NodeDto))] + [Index(IndexTypes.NonClustered, Name = "IX_cmsPropertyData_1")] public int NodeId { get; set; } [Column("versionId")] + [NullSetting(NullSetting = NullSettings.Null)] + [Index(IndexTypes.NonClustered, Name = "IX_cmsPropertyData_2")] public Guid? VersionId { get; set; } [Column("propertytypeid")] + [ForeignKey(typeof(PropertyTypeDto))] + [Index(IndexTypes.NonClustered, Name = "IX_cmsPropertyData_3")] public int PropertyTypeId { get; set; } [Column("dataInt")] + [NullSetting(NullSetting = NullSettings.Null)] public int? Integer { get; set; } [Column("dataDate")] + [NullSetting(NullSetting = NullSettings.Null)] public DateTime? Date { get; set; } [Column("dataNvarchar")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 500)] public string VarChar { get; set; } [Column("dataNtext")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Ntext)] public string Text { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs index a870c5717f..29f2472ca3 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs @@ -1,5 +1,5 @@ -using System.Collections.Generic; -using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,36 +9,49 @@ namespace Umbraco.Core.Models.Rdbms internal class PropertyTypeDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("dataTypeId")] + [ForeignKey(typeof(DataTypeDto), Column = "nodeId")] public int DataTypeId { get; set; } [Column("contentTypeId")] + [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] public int ContentTypeId { get; set; } [Column("propertyTypeGroupId")] - public int? TabId { get; set; } + [NullSetting(NullSetting = NullSettings.Null)] + [ForeignKey(typeof(PropertyTypeGroupDto))] + public int? PropertyTypeGroupId { get; set; } [Column("Alias")] public string Alias { get; set; } [Column("Name")] + [NullSetting(NullSetting = NullSettings.Null)] public string Name { get; set; } [Column("helpText")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] public string HelpText { get; set; } [Column("sortOrder")] + [Constraint(Default = "0")] public int SortOrder { get; set; } [Column("mandatory")] + [Constraint(Default = "0")] public bool Mandatory { get; set; } [Column("validationRegExp")] + [NullSetting(NullSetting = NullSettings.Null)] public string ValidationRegExp { get; set; } [Column("Description")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 2000)] public string Description { get; set; } [ResultColumn] diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs index 12039168ab..8c8a799fa5 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,12 +10,17 @@ namespace Umbraco.Core.Models.Rdbms internal class PropertyTypeGroupDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("parentGroupId")] + [NullSetting(NullSetting = NullSettings.Null)] + [Constraint(Default = "NULL")] + [ForeignKey(typeof(PropertyTypeGroupDto))] public int? ParentGroupId { get; set; } [Column("contenttypeNodeId")] + [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] public int ContentTypeNodeId { get; set; } [Column("text")] diff --git a/src/Umbraco.Core/Models/Rdbms/RelationDto.cs b/src/Umbraco.Core/Models/Rdbms/RelationDto.cs index 393ef1a385..ad7a8738c4 100644 --- a/src/Umbraco.Core/Models/Rdbms/RelationDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/RelationDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,21 +10,27 @@ namespace Umbraco.Core.Models.Rdbms internal class RelationDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("parentId")] + [ForeignKey(typeof(NodeDto), Name = "FK_umbracoRelation_umbracoNode")] public int ParentId { get; set; } [Column("childId")] + [ForeignKey(typeof(NodeDto), Name = "FK_umbracoRelation_umbracoNode1")] public int ChildId { get; set; } [Column("relType")] + [ForeignKey(typeof(RelationTypeDto))] public int RelationType { get; set; } [Column("datetime")] + [Constraint(Default = "getdate()")] public DateTime Datetime { get; set; } [Column("comment")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 1000)] public string Comment { get; set; } } } \ 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 12dfe31220..545f2b25a9 100644 --- a/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,6 +10,7 @@ namespace Umbraco.Core.Models.Rdbms internal class RelationTypeDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("dual")] @@ -24,6 +26,8 @@ namespace Umbraco.Core.Models.Rdbms public string Name { get; set; } [Column("alias")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 100)] public string Alias { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs b/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs index bfdb81d756..24004d326e 100644 --- a/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,12 +9,17 @@ namespace Umbraco.Core.Models.Rdbms public class StylesheetDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false)] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("filename")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 100)] public string Filename { get; set; } [Column("content")] + [DatabaseType(DatabaseTypes.Ntext)] + [NullSetting(NullSetting = NullSettings.Null)] public string Content { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs b/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs index 4628b38fa4..7e6dd51317 100644 --- a/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,15 +9,21 @@ namespace Umbraco.Core.Models.Rdbms internal class StylesheetPropertyDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false)] public int NodeId { get; set; } [Column("stylesheetPropertyEditor")] + [NullSetting(NullSetting = NullSettings.Null)] public bool? Editor { get; set; } [Column("stylesheetPropertyAlias")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string Alias { get; set; } [Column("stylesheetPropertyValue")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 400)] public string Value { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/TagDto.cs b/src/Umbraco.Core/Models/Rdbms/TagDto.cs index 3e4cf55ea7..1a27d006ee 100644 --- a/src/Umbraco.Core/Models/Rdbms/TagDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/TagDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,15 +9,21 @@ namespace Umbraco.Core.Models.Rdbms internal class TagDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("tag")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 200)]//NOTE Is set to [varchar] (200) in Sql Server script public string Tag { get; set; } [Column("ParentId")] + [NullSetting(NullSetting = NullSettings.Null)] public int? ParentId { get; set; } [Column("group")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 100)]//NOTE Is set to [varchar] (100) in Sql Server script public string Group { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs b/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs index 92ce03857d..e18cbeeb12 100644 --- a/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,9 +9,12 @@ namespace Umbraco.Core.Models.Rdbms internal class TagRelationshipDto { [Column("nodeId")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsTagRelationship", OnColumns = "[nodeId], [tagId]")] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("tagId")] + [ForeignKey(typeof(TagDto))] public int TagId { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/TaskDto.cs b/src/Umbraco.Core/Models/Rdbms/TaskDto.cs index 83855f5722..b0cfdc5a3b 100644 --- a/src/Umbraco.Core/Models/Rdbms/TaskDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/TaskDto.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -9,27 +10,36 @@ namespace Umbraco.Core.Models.Rdbms internal class TaskDto { [Column("closed")] + [Constraint(Default = "0")] public bool Closed { get; set; } [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("taskTypeId")] + [ForeignKey(typeof(TaskTypeDto))] public byte TaskTypeId { get; set; } [Column("nodeId")] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("parentUserId")] + [ForeignKey(typeof(UserDto), Name = "FK_cmsTask_umbracoUser")] public int ParentUserId { get; set; } [Column("userId")] + [ForeignKey(typeof(UserDto), Name = "FK_cmsTask_umbracoUser1")] public int UserId { get; set; } [Column("DateTime")] + [Constraint(Default = "getdate()")] public DateTime DateTime { get; set; } [Column("Comment")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 500)] public string Comment { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/TaskTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/TaskTypeDto.cs index 72bd82e2dd..0e09d30d92 100644 --- a/src/Umbraco.Core/Models/Rdbms/TaskTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/TaskTypeDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,9 +9,11 @@ namespace Umbraco.Core.Models.Rdbms internal class TaskTypeDto { [Column("id")] + [PrimaryKeyColumn] public byte Id { get; set; } [Column("alias")] + [Index(IndexTypes.NonClustered)] public string Alias { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs b/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs index f2bc9d6f7d..952cbde168 100644 --- a/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,18 +9,26 @@ namespace Umbraco.Core.Models.Rdbms internal class TemplateDto { [Column("pk")] + [PrimaryKeyColumn] public int PrimaryKey { get; set; } [Column("nodeId")] + [Index(IndexTypes.UniqueNonClustered)] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("master")] + [NullSetting(NullSetting = NullSettings.Null)] + [ForeignKey(typeof(TemplateDto))] public int? Master { get; set; } [Column("alias")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 100)] + [NullSetting(NullSetting = NullSettings.Null)] public string Alias { get; set; } [Column("design")] + [DatabaseType(DatabaseTypes.Ntext)] public string Design { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs b/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs index 18aa6534a0..3f68acf909 100644 --- a/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,9 +9,12 @@ namespace Umbraco.Core.Models.Rdbms internal class User2AppDto { [Column("user")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_user2app", OnColumns = "[user], [app]")] + [ForeignKey(typeof(UserDto))] public int UserId { get; set; } [Column("app")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string AppAlias { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs b/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs index d80fdf3d7a..dd22b82e2d 100644 --- a/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,12 +9,16 @@ namespace Umbraco.Core.Models.Rdbms internal class User2NodeNotifyDto { [Column("userId")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2NodeNotify", OnColumns = "[userId], [nodeId], [action]")] + [ForeignKey(typeof(UserDto))] public int UserId { get; set; } [Column("nodeId")] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("action")] + [DatabaseType(DatabaseTypes.Nchar, Length = 1)] public string Action { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs b/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs index 5798d9dbda..5ddd6dd07a 100644 --- a/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,9 +9,12 @@ namespace Umbraco.Core.Models.Rdbms internal class User2NodePermissionDto { [Column("userId")] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2NodePermission", OnColumns = "[userId], [nodeId], [permission]")] + [ForeignKey(typeof(UserDto))] public int UserId { get; set; } [Column("nodeId")] + [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } [Column("permission")] diff --git a/src/Umbraco.Core/Models/Rdbms/UserDto.cs b/src/Umbraco.Core/Models/Rdbms/UserDto.cs index ced186fd27..3138823376 100644 --- a/src/Umbraco.Core/Models/Rdbms/UserDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/UserDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,42 +9,55 @@ namespace Umbraco.Core.Models.Rdbms internal class UserDto { [Column("id")] + [PrimaryKeyColumn] public int Id { get; set; } [Column("userDisabled")] + [Constraint(Default = "0")] public bool Disabled { get; set; } [Column("userNoConsole")] + [Constraint(Default = "0")] public bool NoConsole { get; set; } [Column("userType")] + [ForeignKey(typeof(UserTypeDto))] public short Type { get; set; } [Column("startStructureID")] public int ContentStartId { get; set; } [Column("startMediaID")] + [NullSetting(NullSetting = NullSettings.Null)] public int? MediaStartId { get; set; } [Column("userName")] public string UserName { get; set; } [Column("userLogin")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 125)] + [Index(IndexTypes.NonClustered)] public string Login { get; set; } [Column("userPassword")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 125)] public string Password { get; set; } [Column("userEmail")] public string Email { get; set; } [Column("userDefaultPermissions")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] public string DefaultPermissions { get; set; } [Column("userLanguage")] + [NullSetting(NullSetting = NullSettings.Null)] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 10)] public string UserLanguage { get; set; } [Column("defaultToLiveEditing")] + [Constraint(Default = "0")] public bool DefaultToLiveEditing { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs index 9678f0b85e..644fbc78d9 100644 --- a/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/UserTypeDto.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { @@ -8,15 +9,20 @@ namespace Umbraco.Core.Models.Rdbms internal class UserTypeDto { [Column("id")] + [PrimaryKeyColumn] public short Id { get; set; } [Column("userTypeAlias")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] + [NullSetting(NullSetting = NullSettings.Null)] public string Alias { get; set; } [Column("userTypeName")] public string Name { get; set; } [Column("userTypeDefaultPermissions")] + [DatabaseType(DatabaseTypes.Nvarchar, Length = 50)] + [NullSetting(NullSetting = NullSettings.Null)] public string DefaultPermissions { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/DatabaseAnnotations/AttributeExtensions.cs b/src/Umbraco.Core/Persistence/DatabaseAnnotations/AttributeExtensions.cs index 80fd277a99..eaf07358fa 100644 --- a/src/Umbraco.Core/Persistence/DatabaseAnnotations/AttributeExtensions.cs +++ b/src/Umbraco.Core/Persistence/DatabaseAnnotations/AttributeExtensions.cs @@ -1,6 +1,6 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations { - public static class AttributeExtensions + internal static class AttributeExtensions { public static string ToSqlSyntax(this NullSettings settings) { @@ -38,6 +38,11 @@ case DatabaseTypes.Integer: syntax = "[int]"; break; + case DatabaseTypes.Nchar: + syntax = "[nchar]"; + if (length > 0) + syntax += string.Format(" ({0})", length); + break; case DatabaseTypes.Nvarchar: syntax = "[nvarchar]"; if (length > 0) @@ -96,10 +101,15 @@ string constraintName = string.IsNullOrEmpty(attribute.Name) ? string.Format("FK_{0}_{1}", tableName, referencedTableName) : attribute.Name; + + string referencedColumn = string.IsNullOrEmpty(attribute.Column) + ? primaryKeyAttribute.Value + : attribute.Column; string syntax = string.Format( "ALTER TABLE [{0}] ADD CONSTRAINT [{1}] FOREIGN KEY ([{2}]) REFERENCES [{3}] ([{4}])", - tableName, constraintName, propertyName, referencedTableName, primaryKeyAttribute.Value); + tableName, constraintName, propertyName, referencedTableName, referencedColumn); + return syntax; } @@ -126,7 +136,12 @@ break; } string name = string.IsNullOrEmpty(attribute.Name) ? string.Format("IX_{0}_{1}", tableName, propertyName) : attribute.Name; - string syntax = string.Format("CREATE {0} INDEX [{1}] ON [{2}] ([{3}])", indexType, name, tableName, propertyName); + + string syntax = string.IsNullOrEmpty(attribute.ForColumns) + ? string.Format("CREATE {0} INDEX [{1}] ON [{2}] ([{3}])", indexType, name, tableName, + propertyName) + : string.Format("CREATE {0} INDEX [{1}] ON [{2}] ({3})", indexType, name, tableName, + attribute.ForColumns); return syntax; } } diff --git a/src/Umbraco.Core/Persistence/DatabaseAnnotations/DatabaseTypes.cs b/src/Umbraco.Core/Persistence/DatabaseAnnotations/DatabaseTypes.cs index c9b7457b00..7ed52d8713 100644 --- a/src/Umbraco.Core/Persistence/DatabaseAnnotations/DatabaseTypes.cs +++ b/src/Umbraco.Core/Persistence/DatabaseAnnotations/DatabaseTypes.cs @@ -9,6 +9,7 @@ DateTime, Ntext, Nvarchar, - Bool + Bool, + Nchar } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/DatabaseAnnotations/ForeignKeyAttribute.cs b/src/Umbraco.Core/Persistence/DatabaseAnnotations/ForeignKeyAttribute.cs index 4c4eb91876..f71eb98543 100644 --- a/src/Umbraco.Core/Persistence/DatabaseAnnotations/ForeignKeyAttribute.cs +++ b/src/Umbraco.Core/Persistence/DatabaseAnnotations/ForeignKeyAttribute.cs @@ -2,7 +2,7 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations { - [AttributeUsage(AttributeTargets.Property)] + [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class ForeignKeyAttribute : ReferencesAttribute { public ForeignKeyAttribute(Type type) : base(type) @@ -13,5 +13,6 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations public string OnUpdate { get; set; } public string Name { get; set; }//Used to override Default naming: FK_thisTableName_refTableName + public string Column { get; set; }//Used to point foreign key to a specific Column. PrimaryKey column is used by default } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/DatabaseAnnotations/IndexAttribute.cs b/src/Umbraco.Core/Persistence/DatabaseAnnotations/IndexAttribute.cs index a094c84e36..08994bdd28 100644 --- a/src/Umbraco.Core/Persistence/DatabaseAnnotations/IndexAttribute.cs +++ b/src/Umbraco.Core/Persistence/DatabaseAnnotations/IndexAttribute.cs @@ -13,5 +13,6 @@ namespace Umbraco.Core.Persistence.DatabaseAnnotations //public Type Type { get; set; } public string Name { get; set; }//Overrides default naming of indexes: IX_tableName public IndexTypes IndexType { get; private set; } + public string ForColumns { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs index 46f4753ca6..712721af4f 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs @@ -88,7 +88,7 @@ namespace Umbraco.Core.Persistence.Factories Mandatory = propertyType.Mandatory, Name = propertyType.Name, SortOrder = propertyType.SortOrder, - TabId = tabId + PropertyTypeGroupId = tabId }; if (propertyType.HasIdentity) diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs index 7b9deed006..38d167b8c9 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs @@ -16,49 +16,71 @@ namespace Umbraco.Core.Persistence.Migrations.Initial public void InitializeDatabase() { + //NOTE Please mind the order of the table creation, as some references requires other tables. using(var transaction = _database.GetTransaction()) { + _database.CreateTable(); + + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); + _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); + _database.CreateTable(); - _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); + _database.CreateTable(); - _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); _database.CreateTable(); - _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); - _database.CreateTable(); transaction.Complete(); } diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index 87066c1979..c18b936fa4 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -35,18 +35,21 @@ namespace Umbraco.Core.Persistence var foreignKeyConstraints = new List(); var indexes = new List(); - var last = objProperties.Last(); + var sb = new StringBuilder(); + foreach (var propertyInfo in objProperties) { //If current property is a ResultColumn then skip it var resultColumnAttribute = propertyInfo.FirstAttribute(); - if(resultColumnAttribute != null) continue; + if(resultColumnAttribute != null) + { + continue; + } //Assumes ExplicitColumn attribute and thus having a ColumnAttribute with the name of the column var columnAttribute = propertyInfo.FirstAttribute(); if(columnAttribute == null) continue; - var sb = new StringBuilder(); sb.AppendFormat("[{0}]", columnAttribute.Name); var databaseTypeAttribute = propertyInfo.FirstAttribute(); @@ -66,22 +69,50 @@ namespace Umbraco.Core.Persistence { sb.AppendFormat(" [int]"); } + else if (propertyInfo.PropertyType == typeof(int?)) + { + sb.AppendFormat(" [int]"); + } + else if (propertyInfo.PropertyType == typeof(long)) + { + sb.AppendFormat(" [bigint]"); + } else if (propertyInfo.PropertyType == typeof(bool)) { sb.AppendFormat(" [bit]"); } + else if (propertyInfo.PropertyType == typeof(bool?)) + { + sb.AppendFormat(" [bit]"); + } else if (propertyInfo.PropertyType == typeof(byte)) { - sb.AppendFormat(" [tinyint]"); + sb.AppendFormat(DatabaseFactory.Current.DatabaseProvider == DatabaseProviders.SqlServer + ? " [tinyint]" + : " [int]"); + } + else if (propertyInfo.PropertyType == typeof(short)) + { + sb.AppendFormat(DatabaseFactory.Current.DatabaseProvider == DatabaseProviders.SqlServer + ? " [smallint]" + : " [int]"); } else if (propertyInfo.PropertyType == typeof(DateTime)) { sb.AppendFormat(" [datetime]"); } + else if (propertyInfo.PropertyType == typeof(DateTime?)) + { + sb.AppendFormat(" [datetime]"); + } else if (propertyInfo.PropertyType == typeof(Guid)) { sb.AppendFormat(" [uniqueidentifier]"); } + else if (propertyInfo.PropertyType == typeof(Guid?)) + { + sb.AppendFormat(" [uniqueidentifier]"); + } } var nullSettingAttribute = propertyInfo.FirstAttribute(); @@ -107,16 +138,15 @@ namespace Umbraco.Core.Persistence if(constraintAttribute != null) sb.AppendFormat(" {0}", constraintAttribute.ToSqlSyntax(tableName, columnAttribute.Name)); - if (propertyInfo != last) - sb.Append(", "); - - sql.Append(sb.ToString()); + sb.Append(", "); //Look for foreign keys - var foreignKeyAttribute = propertyInfo.FirstAttribute(); - if (foreignKeyAttribute != null) + var foreignKeyAttributes = propertyInfo.MultipleAttribute(); + if (foreignKeyAttributes != null) { - foreignKeyConstraints.Add(new Sql(foreignKeyAttribute.ToSqlSyntax(tableName, columnAttribute.Name))); + foreignKeyConstraints.AddRange( + foreignKeyAttributes.Select( + attribute => new Sql(attribute.ToSqlSyntax(tableName, columnAttribute.Name)))); } //Look for indexes @@ -127,6 +157,7 @@ namespace Umbraco.Core.Persistence } } + sql.Append(sb.ToString().TrimEnd(", ".ToCharArray())); sql.Append(")");//End var tableExist = db.TableExist(tableName); diff --git a/src/Umbraco.Core/TypeExtensions.cs b/src/Umbraco.Core/TypeExtensions.cs index 9e2af0225a..47f876abf0 100644 --- a/src/Umbraco.Core/TypeExtensions.cs +++ b/src/Umbraco.Core/TypeExtensions.cs @@ -239,5 +239,16 @@ namespace Umbraco.Core var attrs = propertyInfo.GetCustomAttributes(typeof(TAttribute), inherit); return (TAttribute)(attrs.Length > 0 ? attrs[0] : null); } + + public static IEnumerable MultipleAttribute(this PropertyInfo propertyInfo) + { + return propertyInfo.MultipleAttribute(true); + } + + public static IEnumerable MultipleAttribute(this PropertyInfo propertyInfo, bool inherit) + { + var attrs = propertyInfo.GetCustomAttributes(typeof(TAttribute), inherit); + return (attrs.Length > 0 ? attrs.ToList().ConvertAll(input => (TAttribute)input) : null); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/DatabaseExtensionsTest.cs b/src/Umbraco.Tests/Persistence/DatabaseExtensionsTest.cs index 83e7856832..3b6993fb57 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseExtensionsTest.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseExtensionsTest.cs @@ -9,6 +9,11 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence { + /// + /// Test with basic setup of an Sql CE database, which runs tests for the creation of all tables + /// with their referenced dependencies. The creation isn't committed to the database or asserted, but + /// the tests will fail if the creation isn't possible. + /// [TestFixture] public class DatabaseExtensionsTest { @@ -84,17 +89,521 @@ namespace Umbraco.Tests.Persistence } } - [Test, NUnit.Framework.Ignore] + [Test] public void Can_Create_cmsContentTypeAllowedContentType_Table() { var factory = DatabaseFactory.Current; using (Transaction transaction = factory.Database.GetTransaction()) { - //Requires the cmsContentType table in order to create refecences + factory.Database.CreateTable(); + factory.Database.CreateTable(); factory.Database.CreateTable(); //transaction.Complete(); } } + + [Test] + public void Can_Create_cmsContentType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsContentVersion_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsContentXml_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsDataType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsDataTypePreValues_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsDictionary_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsLanguageText_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsTemplate_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsDocument_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsDocumentType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoDomains_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoLanguage_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoLog_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMacro_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMacroPropertyType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMacroProperty_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMember_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMember2MemberGroup_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsMemberType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsPreviewXml_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsPropertyData_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsPropertyType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsPropertyTypeGroup_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoRelation_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoRelationType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsStylesheet_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsStylesheetProperty_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsTags_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsTagRelationship_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsTask_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_cmsTaskType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUserLogins_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUser_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUserType_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUser2app_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUser2NodeNotify_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } + + [Test] + public void Can_Create_umbracoUser2NodePermission_Table() + { + var factory = DatabaseFactory.Current; + using (Transaction transaction = factory.Database.GetTransaction()) + { + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + factory.Database.CreateTable(); + + //transaction.Complete(); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs index 7c3f965581..f26bbd4f84 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs @@ -1,5 +1,10 @@ -using NUnit.Framework; +using System; +using System.Configuration; +using System.Data.SqlServerCe; +using System.IO; +using NUnit.Framework; using Umbraco.Core.Persistence; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence { @@ -22,5 +27,37 @@ namespace Umbraco.Tests.Persistence Assert.AreEqual(DatabaseProviders.SqlServerCE, provider); } + + [Test] + public void Can_Assert_Created_Database() + { + string path = TestHelper.CurrentAssemblyDirectory; + AppDomain.CurrentDomain.SetData("DataDirectory", path); + + //Delete database file before continueing + string filePath = string.Concat(path, "\\test.sdf"); + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + //Get the connectionstring settings from config + var settings = ConfigurationManager.ConnectionStrings["umbracoDbDsn"]; + + //Create the Sql CE database + var engine = new SqlCeEngine(settings.ConnectionString); + engine.CreateDatabase(); + + //Create the umbraco database + DatabaseFactory.Current.Database.Initialize(); + + bool umbracoNodeTable = DatabaseFactory.Current.Database.TableExist("umbracoNode"); + bool umbracoUserTable = DatabaseFactory.Current.Database.TableExist("umbracoUser"); + bool cmsTagsTable = DatabaseFactory.Current.Database.TableExist("cmsTags"); + + Assert.That(umbracoNodeTable, Is.True); + Assert.That(umbracoUserTable, Is.True); + Assert.That(cmsTagsTable, Is.True); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs new file mode 100644 index 0000000000..5133108170 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -0,0 +1,47 @@ +using System; +using System.Configuration; +using System.Data.SqlServerCe; +using System.IO; +using NUnit.Framework; +using Umbraco.Core.Persistence; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Use this abstract class for tests that requires a Sql Ce database populated with the umbraco db schema. + /// The PetaPoco Database class should be used through the singleton. + /// + [TestFixture] + public abstract class BaseDatabaseFactoryTest + { + [SetUp] + public virtual void Initialize() + { + string path = TestHelper.CurrentAssemblyDirectory; + AppDomain.CurrentDomain.SetData("DataDirectory", path); + + //Delete database file before continueing + string filePath = string.Concat(path, "\\test.sdf"); + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + //Get the connectionstring settings from config + var settings = ConfigurationManager.ConnectionStrings["umbracoDbDsn"]; + + //Create the Sql CE database + var engine = new SqlCeEngine(settings.ConnectionString); + engine.CreateDatabase(); + + //Create the umbraco database + DatabaseFactory.Current.Database.Initialize(); + } + + [TearDown] + public virtual void TearDown() + { + AppDomain.CurrentDomain.SetData("DataDirectory", null); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs new file mode 100644 index 0000000000..4b8007d8d0 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs @@ -0,0 +1,55 @@ +using System; +using System.Data.SqlServerCe; +using System.IO; +using NUnit.Framework; +using Umbraco.Core.Persistence; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Use this abstract class for tests that requires direct access to the PetaPoco object. + /// This base test class uses Sql Ce populated with the umbraco db schema. + /// + [TestFixture] + public abstract class BaseDatabaseTest + { + private Database _database; + + [SetUp] + public virtual void Initialize() + { + string path = TestHelper.CurrentAssemblyDirectory; + AppDomain.CurrentDomain.SetData("DataDirectory", path); + + //Delete database file before continueing + string filePath = string.Concat(path, "\\test.sdf"); + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + //Get the connectionstring settings from config + var connectionstring = "Datasource=|DataDirectory|test.sdf"; + var providerName = "System.Data.SqlServerCe.4.0"; + + //Create the Sql CE database + var engine = new SqlCeEngine(connectionstring); + engine.CreateDatabase(); + + //Create the umbraco database + _database = new Database(connectionstring, providerName); + _database.Initialize(); + } + + protected Database Database + { + get { return _database; } + } + + [TearDown] + public virtual void TearDown() + { + AppDomain.CurrentDomain.SetData("DataDirectory", null); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 3f874c22c0..96e49144eb 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -113,6 +113,7 @@ + @@ -125,6 +126,7 @@ +