diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs
index ba60925b11..eb9cc6903e 100644
--- a/src/Umbraco.Core/CoreBootManager.cs
+++ b/src/Umbraco.Core/CoreBootManager.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using System.Threading;
using AutoMapper;
using LightInject;
+using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
@@ -40,19 +41,19 @@ namespace Umbraco.Core
{
///
- /// A bootstrapper for the Umbraco application which initializes all objects for the Core of the application
+ /// A bootstrapper for the Umbraco application which initializes all objects for the Core of the application
///
///
/// This does not provide any startup functionality relating to web objects
///
public class CoreBootManager : IBootManager
{
-
+
private ServiceContainer _appStartupEvtContainer;
protected ProfilingLogger ProfilingLogger { get; private set; }
private DisposableTimer _timer;
protected PluginManager PluginManager { get; private set; }
-
+
private bool _isInitialized = false;
private bool _isStarted = false;
@@ -76,7 +77,7 @@ namespace Umbraco.Core
public CoreBootManager(UmbracoApplicationBase umbracoApplication)
{
if (umbracoApplication == null) throw new ArgumentNullException("umbracoApplication");
- _umbracoApplication = umbracoApplication;
+ _umbracoApplication = umbracoApplication;
}
internal CoreBootManager(UmbracoApplicationBase umbracoApplication, ProfilingLogger logger)
@@ -91,7 +92,7 @@ namespace Umbraco.Core
{
if (_isInitialized)
throw new InvalidOperationException("The boot manager has already been initialized");
-
+
//Create logger/profiler, and their resolvers, these are special resolvers that can be resolved before frozen so we can start logging
LoggerResolver.Current = new LoggerResolver(_umbracoApplication.Logger) { CanResolveBeforeFrozen = true };
var profiler = CreateProfiler();
@@ -99,7 +100,7 @@ namespace Umbraco.Core
ProfilingLogger = new ProfilingLogger(_umbracoApplication.Logger, profiler);
ProfilingLogger = ProfilingLogger?? new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
-
+
ApplicationCache = CreateApplicationCache();
_timer = ProfilingLogger.TraceDuration(
@@ -112,26 +113,24 @@ namespace Umbraco.Core
//TODO: this is currently a singleton but it would be better if it weren't. Unfortunately the only way to get
// rid of this singleton would be to put it into IoC and then use the ServiceLocator pattern.
PluginManager.Current = PluginManager = new PluginManager(ServiceProvider, ApplicationCache.RuntimeCache, ProfilingLogger, true);
-
+
//build up core IoC servoces
ConfigureCoreServices(Container);
//set the singleton resolved from the core container
ApplicationContext.Current = ApplicationContext = Container.GetInstance();
- //TODO: Remove these for v8!
+ //TODO: Remove these for v8!
LegacyPropertyEditorIdToAliasConverter.CreateMappingsForCoreEditors();
LegacyParameterEditorAliasConverter.CreateMappingsForCoreEditors();
- //TODO: Make this as part of the db ctor!
- Database.Mapper = new PetaPocoMapper();
-
+
//Create a 'child'container which is a copy of all of the current registrations and begin a sub scope for it
// this child container will be used to manage the application event handler instances and the scope will be
// completed at the end of the boot process to allow garbage collection
_appStartupEvtContainer = Container.CreateChildContainer();
_appStartupEvtContainer.BeginScope();
_appStartupEvtContainer.RegisterCollection(PluginManager.ResolveApplicationStartupHandlers());
-
+
//build up standard IoC services
ConfigureApplicationServices(Container);
@@ -143,11 +142,11 @@ namespace Umbraco.Core
{
try
{
- using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationInitialized", x.GetType())))
- {
- x.OnApplicationInitialized(UmbracoApplication, ApplicationContext);
+ using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationInitialized", x.GetType())))
+ {
+ x.OnApplicationInitialized(UmbracoApplication, ApplicationContext);
+ }
}
- }
catch (Exception ex)
{
ProfilingLogger.Logger.Error("An error occurred running OnApplicationInitialized for handler " + x.GetType(), ex);
@@ -166,12 +165,12 @@ namespace Umbraco.Core
internal virtual void ConfigureCoreServices(ServiceContainer container)
{
container.Register(factory => container);
-
+
//Logging
container.RegisterSingleton(factory => _umbracoApplication.Logger);
container.RegisterSingleton(factory => ProfilingLogger.Profiler);
container.RegisterSingleton(factory => ProfilingLogger);
-
+
//Config
container.RegisterFrom();
@@ -193,7 +192,7 @@ namespace Umbraco.Core
container.RegisterSingleton();
container.Register(factory => FileSystemProviderManager.Current.GetFileSystemProvider());
-
+
}
///
@@ -202,9 +201,9 @@ namespace Umbraco.Core
///
internal virtual void ConfigureApplicationServices(ServiceContainer container)
{
-
+
}
-
+
///
/// Creates the ApplicationCache based on a new instance of System.Web.Caching.Cache
///
@@ -260,7 +259,7 @@ namespace Umbraco.Core
}
///
- /// Fires after initialization and calls the callback to allow for customizations to occur &
+ /// Fires after initialization and calls the callback to allow for customizations to occur &
/// Ensure that the OnApplicationStarting methods of the IApplicationEvents are called
///
///
@@ -275,11 +274,11 @@ namespace Umbraco.Core
{
try
{
- using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationStarting", x.GetType())))
- {
- x.OnApplicationStarting(UmbracoApplication, ApplicationContext);
+ using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationStarting", x.GetType())))
+ {
+ x.OnApplicationStarting(UmbracoApplication, ApplicationContext);
+ }
}
- }
catch (Exception ex)
{
ProfilingLogger.Logger.Error("An error occurred running OnApplicationStarting for handler " + x.GetType(), ex);
@@ -306,7 +305,7 @@ namespace Umbraco.Core
{
if (_isComplete)
throw new InvalidOperationException("The boot manager has already been completed");
-
+
FreezeResolution();
//Here we need to make sure the db can be connected to
@@ -318,16 +317,16 @@ namespace Umbraco.Core
((UserService) ApplicationContext.Services.UserService).IsUpgrading = true;
-
+
//call OnApplicationStarting of each application events handler
Parallel.ForEach(_appStartupEvtContainer.GetAllInstances(), x =>
{
try
{
- using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationStarted", x.GetType())))
- {
- x.OnApplicationStarted(UmbracoApplication, ApplicationContext);
- }
+ using (ProfilingLogger.DebugDuration(string.Format("Executing {0} in ApplicationStarted", x.GetType())))
+ {
+ x.OnApplicationStarted(UmbracoApplication, ApplicationContext);
+ }
}
catch (Exception ex)
{
@@ -445,7 +444,7 @@ namespace Umbraco.Core
Container, ProfilingLogger.Logger,
() => PluginManager.ResolveAssignedMapperTypes());
-
+
//RepositoryResolver.Current = new RepositoryResolver(
// new RepositoryFactory(ApplicationCache));
@@ -469,7 +468,7 @@ namespace Umbraco.Core
PluginManager.ResolveTypes());
// use the new DefaultShortStringHelper
- ShortStringHelperResolver.Current = new ShortStringHelperResolver(Container,
+ ShortStringHelperResolver.Current = new ShortStringHelperResolver(Container,
factory => new DefaultShortStringHelper(factory.GetInstance()).WithDefaultConfig());
UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(
diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs
index 1f00fb0df9..8f94c993ba 100644
--- a/src/Umbraco.Core/DatabaseContext.cs
+++ b/src/Umbraco.Core/DatabaseContext.cs
@@ -6,6 +6,7 @@ using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Xml.Linq;
+using NPoco;
using Semver;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
@@ -789,5 +790,10 @@ namespace Umbraco.Core
return true;
}
+
+ public Sql Sql()
+ {
+ return NPoco.Sql.BuilderFor(new SqlContext(SqlSyntax, Database));
+ }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs b/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs
index 2d8e0109ec..f6ff4f1914 100644
--- a/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs
+++ b/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs
@@ -23,16 +23,20 @@ namespace Umbraco.Core.DependencyInjection
{
container.RegisterSingleton(factory => new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, factory.GetInstance()));
container.RegisterSingleton(factory => GetDbContext(factory));
+
container.RegisterSingleton(factory => SqlSyntaxProviders.CreateDefault(factory.GetInstance()));
+ container.Register(factory => factory.GetInstance().SqlSyntax);
+
container.RegisterSingleton();
- container.RegisterSingleton(factory => new PetaPocoUnitOfWorkProvider(factory.GetInstance()));
+ container.RegisterSingleton(factory => new NPocoUnitOfWorkProvider(factory.GetInstance()));
+
container.RegisterSingleton(factory => new MappingResolver(
factory.GetInstance(),
factory.GetInstance(),
() => factory.GetInstance().ResolveAssignedMapperTypes()));
container.Register();
- container.Register(factory => factory.GetInstance().SqlSyntax);
container.RegisterSingleton(factory => CacheHelper.CreateDisabledCacheHelper(), "DisabledCache");
+
container.RegisterSingleton(factory => new PhysicalFileSystem(SystemDirectories.Scripts), "ScriptFileSystem");
container.RegisterSingleton(factory => new PhysicalFileSystem(SystemDirectories.MvcViews + "/Partials/"), "PartialViewFileSystem");
container.RegisterSingleton(factory => new PhysicalFileSystem(SystemDirectories.MvcViews + "/MacroPartials/"), "PartialViewMacroFileSystem");
diff --git a/src/Umbraco.Core/EnumerableExtensions.cs b/src/Umbraco.Core/EnumerableExtensions.cs
index 58d4d453b7..156831670a 100644
--- a/src/Umbraco.Core/EnumerableExtensions.cs
+++ b/src/Umbraco.Core/EnumerableExtensions.cs
@@ -20,9 +20,33 @@ namespace Umbraco.Core
if (groupSize <= 0)
throw new ArgumentException("Must be greater than zero.", "groupSize");
- return source
- .Select((x, i) => Tuple.Create(i / groupSize, x))
- .GroupBy(t => t.Item1, t => t.Item2);
+
+ // following code derived from MoreLinq and does not allocate bazillions of tuples
+
+ T[] temp = null;
+ var count = 0;
+
+ foreach (var item in source)
+ {
+ if (temp == null) temp = new T[groupSize];
+ temp[count++] = item;
+ if (count != groupSize) continue;
+ yield return temp/*.Select(x => x)*/;
+ temp = null;
+ count = 0;
+ }
+
+ if (temp != null && count > 0)
+ yield return temp.Take(count);
+ }
+
+ public static IEnumerable SelectByGroups(this IEnumerable source, Func, IEnumerable> selector, int groupSize)
+ {
+ // don't want to use a SelectMany(x => x) here - isn't this better?
+ // ReSharper disable once LoopCanBeConvertedToQuery
+ foreach (var resultGroup in source.InGroupsOf(groupSize).Select(selector))
+ foreach (var result in resultGroup)
+ yield return result;
}
/// The distinct by.
@@ -287,7 +311,7 @@ namespace Umbraco.Core
///
/// The logic for this is taken from:
/// http://stackoverflow.com/questions/4576723/test-whether-two-ienumerablet-have-the-same-values-with-the-same-frequencies
- ///
+ ///
/// There's a few answers, this one seems the best for it's simplicity and based on the comment of Eamon
///
public static bool UnsortedSequenceEqual(this IEnumerable source, IEnumerable other)
@@ -301,5 +325,27 @@ namespace Umbraco.Core
&& list1Groups.All(g => g.Count() == list2Groups[g.Key].Count());
}
+ ///
+ /// Transforms an enumerable.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static IEnumerable Transform(this IEnumerable source, Func, IEnumerable> transform)
+ {
+ return transform(source);
+ }
+
+ ///
+ /// Gets a null IEnumerable as an empty IEnumerable.
+ ///
+ ///
+ ///
+ ///
+ public static IEnumerable EmptyNull(this IEnumerable items)
+ {
+ return items ?? Enumerable.Empty();
+ }
}
}
diff --git a/src/Umbraco.Core/ListExtensions.cs b/src/Umbraco.Core/ListExtensions.cs
new file mode 100644
index 0000000000..e639cbd5c7
--- /dev/null
+++ b/src/Umbraco.Core/ListExtensions.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+
+namespace Umbraco.Core
+{
+ ///
+ /// Provides extensions to the List type.
+ ///
+ internal static class ListExtensions
+ {
+ // based upon the original Zip method
+ public static IEnumerable Zip(this IEnumerable e1, IEnumerable e2, IEnumerable e3,
+ Func resultSelector)
+ {
+ if (e1 == null) throw new ArgumentNullException("e1");
+ if (e2 == null) throw new ArgumentNullException("e2");
+ if (e3 == null) throw new ArgumentNullException("e3");
+ if (resultSelector == null) throw new ArgumentNullException("resultSelector");
+ return ZipIterator(e1, e2, e3, resultSelector);
+ }
+
+ private static IEnumerable ZipIterator(IEnumerable ie1, IEnumerable ie2, IEnumerable ie3,
+ Func resultSelector)
+ {
+ var e1 = ie1.GetEnumerator();
+ try
+ {
+ var e2 = ie2.GetEnumerator();
+ var e3 = ie3.GetEnumerator();
+ try
+ {
+ while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
+ yield return resultSelector(e1.Current, e2.Current, e3.Current);
+ }
+ finally
+ {
+ if (e2 != null)
+ e2.Dispose();
+ if (e3 != null)
+ e3.Dispose();
+ }
+ }
+ finally
+ {
+ if (e1 != null)
+ e1.Dispose();
+ }
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Models/Rdbms/AccessDto.cs b/src/Umbraco.Core/Models/Rdbms/AccessDto.cs
index 37b1dbddd8..b9a512e027 100644
--- a/src/Umbraco.Core/Models/Rdbms/AccessDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/AccessDto.cs
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Security.AccessControl;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -9,7 +10,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoAccess")]
- [PrimaryKey("id", autoIncrement = false)]
+ [PrimaryKey("id", AutoIncrement = false)]
[ExplicitColumns]
internal class AccessDto
{
@@ -39,6 +40,7 @@ namespace Umbraco.Core.Models.Rdbms
public DateTime UpdateDate { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "AccessId")]
public List Rules { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/AccessRuleDto.cs b/src/Umbraco.Core/Models/Rdbms/AccessRuleDto.cs
index 78e3444e56..07f9d4f175 100644
--- a/src/Umbraco.Core/Models/Rdbms/AccessRuleDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/AccessRuleDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -6,7 +7,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoAccessRule")]
- [PrimaryKey("id", autoIncrement = false)]
+ [PrimaryKey("id", AutoIncrement = false)]
[ExplicitColumns]
internal class AccessRuleDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/CacheInstructionDto.cs b/src/Umbraco.Core/Models/Rdbms/CacheInstructionDto.cs
index c24004b7dc..182b8c67b3 100644
--- a/src/Umbraco.Core/Models/Rdbms/CacheInstructionDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/CacheInstructionDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentDto.cs
index eb9a66a7f2..8cef85b998 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentDto.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
@@ -22,6 +23,7 @@ namespace Umbraco.Core.Models.Rdbms
public int ContentTypeId { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "NodeId")]
public NodeDto NodeDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentType2ContentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentType2ContentTypeDto.cs
index 89773ef1ee..a4e5b6b71b 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentType2ContentTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentType2ContentTypeDto.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs
index 91904437f0..9c101ffda4 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsContentTypeAllowedContentType")]
- [PrimaryKey("Id", autoIncrement = false)]
+ [PrimaryKey("Id", AutoIncrement = false)]
[ExplicitColumns]
internal class ContentTypeAllowedContentTypeDto
{
@@ -22,6 +23,7 @@ namespace Umbraco.Core.Models.Rdbms
public int SortOrder { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne)]
public ContentTypeDto ContentTypeDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs
index 8d163abf44..483587cffc 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentTypeDto.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentTypeTemplateDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentTypeTemplateDto.cs
index 88ef02ea90..5ebd97319a 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentTypeTemplateDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentTypeTemplateDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsDocumentType")]
- [PrimaryKey("contentTypeNodeId", autoIncrement = false)]
+ [PrimaryKey("contentTypeNodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class ContentTypeTemplateDto
{
@@ -23,6 +24,7 @@ namespace Umbraco.Core.Models.Rdbms
public bool IsDefault { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne)]
public ContentTypeDto ContentTypeDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs
index 3bd85cccf6..715f9908e4 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentVersionDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -28,6 +29,7 @@ namespace Umbraco.Core.Models.Rdbms
public DateTime VersionDate { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "NodeId", ReferenceMemberName = "NodeId")]
public ContentDto ContentDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs
index ca48a4074c..c72af43901 100644
--- a/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ContentXmlDto.cs
@@ -1,11 +1,12 @@
using System.Data;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsContentXml")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class ContentXmlDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs
index b0e63b0726..148116d70e 100644
--- a/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/DataTypeDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
@@ -26,6 +27,7 @@ namespace Umbraco.Core.Models.Rdbms
public string DbType { get; set; }//NOTE Is set to [varchar] (50) in Sql Server script
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "DataTypeId")]
public NodeDto NodeDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs b/src/Umbraco.Core/Models/Rdbms/DataTypePreValueDto.cs
index 652e63df0b..69c9e17dbd 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs b/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs
index 712d1937a9..262c9f3c5b 100644
--- a/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/DictionaryDto.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
@@ -28,6 +29,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Key { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.Many, ColumnName = "UniqueId", ReferenceMemberName = "UniqueId")]
public List LanguageTextDtos { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs
index 88e04087c9..2ad44fbe58 100644
--- a/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/DocumentDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -6,7 +7,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsDocument")]
- [PrimaryKey("versionId", autoIncrement = false)]
+ [PrimaryKey("versionId", AutoIncrement = false)]
[ExplicitColumns]
internal class DocumentDto
{
@@ -46,16 +47,18 @@ namespace Umbraco.Core.Models.Rdbms
[NullSetting(NullSetting = NullSettings.Null)]
[ForeignKey(typeof(TemplateDto), Column = "nodeId")]
public int? TemplateId { get; set; }
-
+
[Column("newest")]
[Constraint(Default = "0")]
[Index(IndexTypes.NonClustered, Name = "IX_cmsDocument_newest")]
public bool Newest { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")]
public ContentVersionDto ContentVersionDto { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")]
public DocumentPublishedReadOnlyDto DocumentPublishedReadOnlyDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentPublishedReadOnlyDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentPublishedReadOnlyDto.cs
index 4a7e359d91..788e321877 100644
--- a/src/Umbraco.Core/Models/Rdbms/DocumentPublishedReadOnlyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/DocumentPublishedReadOnlyDto.cs
@@ -1,10 +1,11 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsDocument")]
- [PrimaryKey("versionId", autoIncrement = false)]
+ [PrimaryKey("versionId", AutoIncrement = false)]
[ExplicitColumns]
internal class DocumentPublishedReadOnlyDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/DomainDto.cs b/src/Umbraco.Core/Models/Rdbms/DomainDto.cs
index e43c1bdeae..e78c442184 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/ExternalLoginDto.cs b/src/Umbraco.Core/Models/Rdbms/ExternalLoginDto.cs
index 803c25fdfc..1f335ec6ce 100644
--- a/src/Umbraco.Core/Models/Rdbms/ExternalLoginDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ExternalLoginDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs b/src/Umbraco.Core/Models/Rdbms/LanguageDto.cs
index a634dca0a4..2e6a4fdae2 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs b/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs
index 87329fbd4c..e14ffdb8a8 100644
--- a/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/LanguageTextDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
diff --git a/src/Umbraco.Core/Models/Rdbms/LogDto.cs b/src/Umbraco.Core/Models/Rdbms/LogDto.cs
index be67b5873a..277720d29b 100644
--- a/src/Umbraco.Core/Models/Rdbms/LogDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/LogDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/MacroDto.cs b/src/Umbraco.Core/Models/Rdbms/MacroDto.cs
index 15422f7a08..1affe3a04e 100644
--- a/src/Umbraco.Core/Models/Rdbms/MacroDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/MacroDto.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
@@ -59,6 +60,7 @@ namespace Umbraco.Core.Models.Rdbms
public string MacroFilePath { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "Macro")]
public List MacroPropertyDtos { 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 e2efddc829..6d10315ec1 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
@@ -11,8 +12,8 @@ namespace Umbraco.Core.Models.Rdbms
[Column("id")]
[PrimaryKeyColumn]
public int Id { get; set; }
-
- [Column("editorAlias")]
+
+ [Column("editorAlias")]
public string EditorAlias { get; set; }
[Column("macro")]
diff --git a/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs
index 888f331364..653f4d3c87 100644
--- a/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/Member2MemberGroupDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsMember2MemberGroup")]
- [PrimaryKey("Member", autoIncrement = false)]
+ [PrimaryKey("Member", AutoIncrement = false)]
[ExplicitColumns]
internal class Member2MemberGroupDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/MemberDto.cs b/src/Umbraco.Core/Models/Rdbms/MemberDto.cs
index e5f7b3f17c..35d5db1042 100644
--- a/src/Umbraco.Core/Models/Rdbms/MemberDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/MemberDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsMember")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class MemberDto
{
@@ -30,6 +31,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Password { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")]
public ContentVersionDto ContentVersionDto { 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 c9432652af..7d637e74c6 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/MemberTypeReadOnlyDto.cs b/src/Umbraco.Core/Models/Rdbms/MemberTypeReadOnlyDto.cs
index 4833cb33f0..4997134ccf 100644
--- a/src/Umbraco.Core/Models/Rdbms/MemberTypeReadOnlyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/MemberTypeReadOnlyDto.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Models.Rdbms
@@ -68,11 +69,13 @@ namespace Umbraco.Core.Models.Rdbms
/* PropertyTypes */
//TODO Add PropertyTypeDto (+MemberTypeDto and DataTypeDto as one) ReadOnly list
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "ContentTypeId")]
public List PropertyTypes { get; set; }
/* PropertyTypeGroups */
//TODO Add PropertyTypeGroupDto ReadOnly list
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "ContentTypeNodeId")]
public List PropertyTypeGroups { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/MigrationDto.cs b/src/Umbraco.Core/Models/Rdbms/MigrationDto.cs
index 1a76895e90..2cff4f1c5a 100644
--- a/src/Umbraco.Core/Models/Rdbms/MigrationDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/MigrationDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs
index c5fac092df..b0860ea34a 100644
--- a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs b/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs
index d981855f24..e3adb3c915 100644
--- a/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PreviewXmlDto.cs
@@ -1,11 +1,12 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsPreviewXml")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class PreviewXmlDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs
index 63e3104d12..8840cb771d 100644
--- a/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PropertyDataDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
@@ -52,6 +53,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Text { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "PropertyTypeId")]
public PropertyTypeDto PropertyTypeDto { get; set; }
[Ignore]
@@ -68,12 +70,12 @@ namespace Umbraco.Core.Models.Rdbms
{
return Decimal.Value;
}
-
+
if (Date.HasValue)
{
return Date.Value;
}
-
+
if (string.IsNullOrEmpty(VarChar) == false)
{
return VarChar;
diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs
index 2be4b24157..cc74268c8a 100644
--- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -52,6 +53,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Description { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "DataTypeId")]
public DataTypeDto DataTypeDto { get; set; }
[Column("UniqueID")]
diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs
index 68de420a97..c560780dcf 100644
--- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -7,7 +8,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsPropertyTypeGroup")]
- [PrimaryKey("id", autoIncrement = true)]
+ [PrimaryKey("id", AutoIncrement = true)]
[ExplicitColumns]
internal class PropertyTypeGroupDto
{
@@ -26,6 +27,7 @@ namespace Umbraco.Core.Models.Rdbms
public int SortOrder { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "PropertyTypeGroupId")]
public List PropertyTypeDtos { get; set; }
[Column("uniqueID")]
diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupReadOnlyDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupReadOnlyDto.cs
index beebef9eeb..ac38b7b642 100644
--- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupReadOnlyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupReadOnlyDto.cs
@@ -1,9 +1,10 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsPropertyTypeGroup")]
- [PrimaryKey("id", autoIncrement = true)]
+ [PrimaryKey("id", AutoIncrement = true)]
[ExplicitColumns]
internal class PropertyTypeGroupReadOnlyDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeReadOnlyDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeReadOnlyDto.cs
index 2f448860b0..bba1546a93 100644
--- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeReadOnlyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeReadOnlyDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/RelationDto.cs b/src/Umbraco.Core/Models/Rdbms/RelationDto.cs
index 368904a5cb..44f0199b17 100644
--- a/src/Umbraco.Core/Models/Rdbms/RelationDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/RelationDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
index 8a6eb5c02a..c927fcf455 100644
--- a/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
diff --git a/src/Umbraco.Core/Models/Rdbms/ServerRegistrationDto.cs b/src/Umbraco.Core/Models/Rdbms/ServerRegistrationDto.cs
index 2a3751c083..55b6145a3a 100644
--- a/src/Umbraco.Core/Models/Rdbms/ServerRegistrationDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/ServerRegistrationDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs b/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs
index 3580fcf918..91132d3a7e 100644
--- a/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/StylesheetDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsStylesheet")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class StylesheetDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs b/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs
index cfe3148764..8e249a8da2 100644
--- a/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/StylesheetPropertyDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsStylesheetProperty")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class StylesheetPropertyDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/TagDto.cs b/src/Umbraco.Core/Models/Rdbms/TagDto.cs
index d612f656bb..cb37f2c723 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs b/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs
index 4fc936713a..d605530839 100644
--- a/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/TagRelationshipDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsTagRelationship")]
- [PrimaryKey("nodeId", autoIncrement = false)]
+ [PrimaryKey("nodeId", AutoIncrement = false)]
[ExplicitColumns]
internal class TagRelationshipDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/TaskDto.cs b/src/Umbraco.Core/Models/Rdbms/TaskDto.cs
index e27f7c0a93..7ce24aa21e 100644
--- a/src/Umbraco.Core/Models/Rdbms/TaskDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/TaskDto.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -44,6 +45,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Comment { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "TaskTypeId")]
public TaskTypeDto TaskTypeDto { 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 2ff61953ce..113908a47c 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs b/src/Umbraco.Core/Models/Rdbms/TemplateDto.cs
index 8e2fe0b9f5..b0bdb17bba 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
@@ -27,6 +28,7 @@ namespace Umbraco.Core.Models.Rdbms
public string Design { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.OneToOne, ColumnName = "NodeId")]
public NodeDto NodeDto { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Rdbms/UmbracoDeployChecksumDto.cs b/src/Umbraco.Core/Models/Rdbms/UmbracoDeployChecksumDto.cs
index 06d904ee88..a012d85563 100644
--- a/src/Umbraco.Core/Models/Rdbms/UmbracoDeployChecksumDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/UmbracoDeployChecksumDto.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
diff --git a/src/Umbraco.Core/Models/Rdbms/UmbracoDeployDependencyDto.cs b/src/Umbraco.Core/Models/Rdbms/UmbracoDeployDependencyDto.cs
index 765a32c929..6ec19a513d 100644
--- a/src/Umbraco.Core/Models/Rdbms/UmbracoDeployDependencyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/UmbracoDeployDependencyDto.cs
@@ -1,3 +1,4 @@
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
diff --git a/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs b/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs
index eafc6be230..5c80c6e117 100644
--- a/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/User2AppDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoUser2app")]
- [PrimaryKey("user", autoIncrement = false)]
+ [PrimaryKey("user", AutoIncrement = false)]
[ExplicitColumns]
internal class User2AppDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs b/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs
index 298ad920d9..e45c0a6ad8 100644
--- a/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/User2NodeNotifyDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoUser2NodeNotify")]
- [PrimaryKey("userId", autoIncrement = false)]
+ [PrimaryKey("userId", AutoIncrement = false)]
[ExplicitColumns]
internal class User2NodeNotifyDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs b/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs
index 1e6662735f..117f88fe66 100644
--- a/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/User2NodePermissionDto.cs
@@ -1,10 +1,11 @@
-using Umbraco.Core.Persistence;
+using NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoUser2NodePermission")]
- [PrimaryKey("userId", autoIncrement = false)]
+ [PrimaryKey("userId", AutoIncrement = false)]
[ExplicitColumns]
internal class User2NodePermissionDto
{
diff --git a/src/Umbraco.Core/Models/Rdbms/UserDto.cs b/src/Umbraco.Core/Models/Rdbms/UserDto.cs
index 05a93c86bf..350f4b4a79 100644
--- a/src/Umbraco.Core/Models/Rdbms/UserDto.cs
+++ b/src/Umbraco.Core/Models/Rdbms/UserDto.cs
@@ -1,12 +1,13 @@
using System;
using System.Collections.Generic;
+using NPoco;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("umbracoUser")]
- [PrimaryKey("id", autoIncrement = true)]
+ [PrimaryKey("id", AutoIncrement = true)]
[ExplicitColumns]
internal class UserDto
{
@@ -75,6 +76,7 @@ namespace Umbraco.Core.Models.Rdbms
public DateTime? LastLoginDate { get; set; }
[ResultColumn]
+ [Reference(ReferenceType.Many, ReferenceMemberName = "UserId")]
public List User2AppDtos { 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 d3268a14fb..8b6d286073 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 NPoco;
+using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
diff --git a/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/DefinitionFactory.cs b/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/DefinitionFactory.cs
index eefacbcbc1..7936ac0fa8 100644
--- a/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/DefinitionFactory.cs
+++ b/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/DefinitionFactory.cs
@@ -2,6 +2,7 @@
using System.Data;
using System.Linq;
using System.Reflection;
+using NPoco;
using Umbraco.Core.Persistence.DatabaseAnnotations;
using Umbraco.Core.Persistence.SqlSyntax;
@@ -11,7 +12,7 @@ namespace Umbraco.Core.Persistence.DatabaseModelDefinitions
{
public static TableDefinition GetTableDefinition(Type modelType, ISqlSyntaxProvider sqlSyntax)
{
- //Looks for PetaPoco's TableNameAtribute for the name of the table
+ //Looks for NPoco's TableNameAtribute for the name of the table
//If no attribute is set we use the name of the Type as the default convention
var tableNameAttribute = modelType.FirstAttribute();
string tableName = tableNameAttribute == null ? modelType.Name : tableNameAttribute.Value;
@@ -108,7 +109,7 @@ namespace Umbraco.Core.Persistence.DatabaseModelDefinitions
var constraintAttribute = propertyInfo.FirstAttribute();
if (constraintAttribute != null)
{
- //Special case for MySQL as it can't have multiple default DateTime values, which
+ //Special case for MySQL as it can't have multiple default DateTime values, which
//is what the umbracoServer table definition is trying to create
if (sqlSyntax is MySqlSyntaxProvider && definition.TableName == "umbracoServer" &&
definition.TableName.ToLowerInvariant() == "lastNotifiedDate".ToLowerInvariant())
diff --git a/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs b/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs
index 418e5b953d..ad6af9dd0a 100644
--- a/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs
+++ b/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs
@@ -1,5 +1,6 @@
using System;
using System.Linq;
+using NPoco;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.Rdbms;
diff --git a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs
index 3e6d245416..d6ad4f1f3c 100644
--- a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs
+++ b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs
@@ -12,7 +12,7 @@ namespace Umbraco.Core.Persistence
{
if (database == null)
throw new ArgumentNullException("database");
- if (database.CurrentTransactionIsolationLevel < IsolationLevel.RepeatableRead)
+ if (database.GetCurrentTransactionIsolationLevel() < IsolationLevel.RepeatableRead)
throw new InvalidOperationException("A transaction with minimum RepeatableRead isolation level is required.");
}
diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
index 72c4275541..f5c2ab9c4f 100644
--- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
+++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
@@ -1,7 +1,12 @@
using System;
+using System.Configuration;
using System.Web;
+using NPoco;
+using NPoco.FluentMappings;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
+using Umbraco.Core.Persistence.FaultHandling;
+using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Persistence
{
@@ -17,82 +22,100 @@ namespace Umbraco.Core.Persistence
{
private readonly string _connectionStringName;
private readonly ILogger _logger;
- public string ConnectionString { get; private set; }
+ private readonly DatabaseFactory _databaseFactory;
+ private readonly RetryPolicy _connectionRetryPolicy;
+ private readonly RetryPolicy _commandRetryPolicy;
+
+ public string ConnectionString { get; private set; }
public string ProviderName { get; private set; }
-
+
//very important to have ThreadStatic:
// see: http://issues.umbraco.org/issue/U4-2172
[ThreadStatic]
- private static volatile UmbracoDatabase _nonHttpInstance;
-
- private static readonly object Locker = new object();
-
+ private static Lazy _nonHttpInstance;
+
///
/// Constructor accepting custom connection string
///
/// Name of the connection string in web.config
///
public DefaultDatabaseFactory(string connectionStringName, ILogger logger)
+ : this(logger)
{
- if (logger == null) throw new ArgumentNullException("logger");
Mandate.ParameterNotNullOrEmpty(connectionStringName, "connectionStringName");
_connectionStringName = connectionStringName;
- _logger = logger;
- }
- ///
- /// Constructor accepting custom connectino string and provider name
- ///
- /// Connection String to use with Database
- /// Database Provider for the Connection String
- ///
- public DefaultDatabaseFactory(string connectionString, string providerName, ILogger logger)
+ if (ConfigurationManager.ConnectionStrings[connectionStringName] == null)
+ throw new InvalidOperationException("Can't find a connection string with the name '" + connectionStringName + "'");
+ var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
+
+ _connectionRetryPolicy = RetryPolicyFactory.GetDefaultSqlConnectionRetryPolicyByConnectionString(connectionString);
+ _commandRetryPolicy = RetryPolicyFactory.GetDefaultSqlCommandRetryPolicyByConnectionString(connectionString);
+ }
+
+ ///
+ /// Constructor accepting custom connectino string and provider name
+ ///
+ /// Connection String to use with Database
+ /// Database Provider for the Connection String
+ ///
+ public DefaultDatabaseFactory(string connectionString, string providerName, ILogger logger)
+ : this(logger)
{
- if (logger == null) throw new ArgumentNullException("logger");
Mandate.ParameterNotNullOrEmpty(connectionString, "connectionString");
Mandate.ParameterNotNullOrEmpty(providerName, "providerName");
ConnectionString = connectionString;
ProviderName = providerName;
+
+ _connectionRetryPolicy = RetryPolicyFactory.GetDefaultSqlConnectionRetryPolicyByConnectionString(connectionString);
+ _commandRetryPolicy = RetryPolicyFactory.GetDefaultSqlCommandRetryPolicyByConnectionString(connectionString);
+ }
+
+ private DefaultDatabaseFactory(ILogger logger)
+ {
+ if (logger == null) throw new ArgumentNullException("logger");
_logger = logger;
- }
+
+ // ensure we have only 1 set of mappers, and 1 PocoDataFactory, for all database
+ // so that everything NPoco is properly cached for the lifetime of the application
+ var mappers = new MapperCollection { new PocoMapper() };
+ var pocoDataFactory = new FluentPocoDataFactory((type, iPocoDataFactory) => new PocoDataBuilder(type, mappers).Init());
+ var config = new FluentConfig(xmappers => pocoDataFactory);
+
+ // create the database factory
+ _databaseFactory = DatabaseFactory.Config(x => x
+ .UsingDatabase(CreateDatabaseInstance) // creating UmbracoDatabase instances
+ .WithFluentConfig(config)); // with proper configuration
+
+ _nonHttpInstance = new Lazy(() => (UmbracoDatabase)_databaseFactory.GetDatabase());
+ }
+
+ private UmbracoDatabase CreateDatabaseInstance()
+ {
+ return string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false
+ ? new UmbracoDatabase(ConnectionString, ProviderName, _logger, _connectionRetryPolicy, _commandRetryPolicy)
+ : new UmbracoDatabase(_connectionStringName, _logger, _connectionRetryPolicy, _commandRetryPolicy);
+ }
public UmbracoDatabase CreateDatabase()
{
- //no http context, create the singleton global object
+ // no http context, create the singleton global object
if (HttpContext.Current == null)
{
- if (_nonHttpInstance == null)
- {
- lock (Locker)
- {
- //double check
- if (_nonHttpInstance == null)
- {
- _nonHttpInstance = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false
- ? new UmbracoDatabase(ConnectionString, ProviderName, _logger)
- : new UmbracoDatabase(_connectionStringName, _logger);
- }
- }
- }
- return _nonHttpInstance;
+ return _nonHttpInstance.Value;
}
- //we have an http context, so only create one per request
- if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false)
- {
- HttpContext.Current.Items.Add(typeof (DefaultDatabaseFactory),
- string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false
- ? new UmbracoDatabase(ConnectionString, ProviderName, _logger)
- : new UmbracoDatabase(_connectionStringName, _logger));
- }
- return (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)];
+ // we have an http context, so only create one per request
+ var db = HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] as UmbracoDatabase;
+ if (db == null) HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] = db = (UmbracoDatabase) _databaseFactory.GetDatabase();
+ return db;
}
protected override void DisposeResources()
{
- if (HttpContext.Current == null)
+ if (HttpContext.Current == null && _nonHttpInstance.IsValueCreated)
{
- _nonHttpInstance.Dispose();
+ _nonHttpInstance.Value.Dispose();
}
else
{
diff --git a/src/Umbraco.Core/Persistence/Factories/MacroFactory.cs b/src/Umbraco.Core/Persistence/Factories/MacroFactory.cs
index d6b54e4797..6327a2ac62 100644
--- a/src/Umbraco.Core/Persistence/Factories/MacroFactory.cs
+++ b/src/Umbraco.Core/Persistence/Factories/MacroFactory.cs
@@ -12,7 +12,7 @@ namespace Umbraco.Core.Persistence.Factories
public IMacro BuildEntity(MacroDto dto)
{
var model = new Macro(dto.Id, dto.UseInEditor, dto.RefreshRate, dto.Alias, dto.Name, dto.ScriptType, dto.ScriptAssembly, dto.Xslt, dto.CacheByPage, dto.CachePersonalized, dto.DontRender, dto.MacroFilePath);
- foreach (var p in dto.MacroPropertyDtos)
+ foreach (var p in dto.MacroPropertyDtos.EmptyNull())
{
model.Properties.Add(new MacroProperty(p.Id, p.Alias, p.Name, p.SortOrder, p.EditorAlias));
}
diff --git a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs
index 658ddad2d4..0685432398 100644
--- a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs
+++ b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs
@@ -93,18 +93,15 @@ namespace Umbraco.Core.Persistence.Factories
entity.IsDraft = dto.NewestVersion != default(Guid) && (dto.PublishedVersion == default(Guid) || dto.PublishedVersion != dto.NewestVersion);
entity.HasPendingChanges = (dto.PublishedVersion != default(Guid) && dto.NewestVersion != default(Guid)) && dto.PublishedVersion != dto.NewestVersion;
- if (dto.UmbracoPropertyDtos != null)
+ foreach (var propertyDto in dto.UmbracoPropertyDtos.EmptyNull())
{
- foreach (var propertyDto in dto.UmbracoPropertyDtos)
+ entity.AdditionalData[propertyDto.PropertyAlias] = new UmbracoEntity.EntityProperty
{
- entity.AdditionalData[propertyDto.PropertyAlias] = new UmbracoEntity.EntityProperty
- {
- PropertyEditorAlias = propertyDto.PropertyEditorAlias,
- Value = propertyDto.NTextValue.IsNullOrWhiteSpace()
- ? propertyDto.NVarcharValue
- : propertyDto.NTextValue.ConvertToJsonIfPossible()
- };
- }
+ PropertyEditorAlias = propertyDto.PropertyEditorAlias,
+ Value = propertyDto.NTextValue.IsNullOrWhiteSpace()
+ ? propertyDto.NVarcharValue
+ : propertyDto.NTextValue.ConvertToJsonIfPossible()
+ };
}
return entity;
diff --git a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs
index bf6ff7d09e..bbc193d461 100644
--- a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs
+++ b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs
@@ -41,7 +41,7 @@ namespace Umbraco.Core.Persistence.Factories
LastPasswordChangeDate = dto.LastPasswordChangeDate ?? DateTime.MinValue
};
- foreach (var app in dto.User2AppDtos)
+ foreach (var app in dto.User2AppDtos.EmptyNull())
{
user.AddAllowedSection(app.AppAlias);
}
diff --git a/src/Umbraco.Core/Persistence/FaultHandling/RetryDbConnection.cs b/src/Umbraco.Core/Persistence/FaultHandling/RetryDbConnection.cs
new file mode 100644
index 0000000000..ee67774dc1
--- /dev/null
+++ b/src/Umbraco.Core/Persistence/FaultHandling/RetryDbConnection.cs
@@ -0,0 +1,222 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using NPoco;
+using Transaction = System.Transactions.Transaction;
+
+namespace Umbraco.Core.Persistence.FaultHandling
+{
+ class RetryDbConnection : DbConnection
+ {
+ private DbConnection _inner;
+ private readonly RetryPolicy _conRetryPolicy;
+ private readonly RetryPolicy _cmdRetryPolicy;
+
+ public RetryDbConnection(DbConnection connection, RetryPolicy conRetryPolicy, RetryPolicy cmdRetryPolicy)
+ {
+ _inner = connection;
+ _inner.StateChange += StateChangeHandler;
+
+ _conRetryPolicy = conRetryPolicy ?? RetryPolicy.NoRetry;
+ _cmdRetryPolicy = cmdRetryPolicy;
+ }
+
+ public DbConnection Inner { get { return _inner; } }
+
+ public override string ConnectionString { get { return _inner.ConnectionString; } set { _inner.ConnectionString = value; } }
+
+ protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel)
+ {
+ return _inner.BeginTransaction(isolationLevel);
+ }
+
+ protected override bool CanRaiseEvents
+ {
+ get { return true; }
+ }
+
+ public override void ChangeDatabase(string databaseName)
+ {
+ _inner.ChangeDatabase(databaseName);
+ }
+
+ public override void Close()
+ {
+ _inner.Close();
+ }
+
+ public override int ConnectionTimeout
+ {
+ get { return _inner.ConnectionTimeout; }
+ }
+
+ protected override DbCommand CreateDbCommand()
+ {
+ return new FaultHandlingDbCommand(this, _inner.CreateCommand(), _cmdRetryPolicy);
+ }
+
+ public override string DataSource
+ {
+ get { return _inner.DataSource; }
+ }
+
+ public override string Database
+ {
+ get { return _inner.Database; }
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && _inner != null)
+ {
+ _inner.StateChange -= StateChangeHandler;
+ _inner.Dispose();
+ }
+ _inner = null;
+ base.Dispose(disposing);
+ }
+
+ public override void EnlistTransaction(Transaction transaction)
+ {
+ _inner.EnlistTransaction(transaction);
+ }
+
+ public override DataTable GetSchema()
+ {
+ return _inner.GetSchema();
+ }
+
+ public override DataTable GetSchema(string collectionName)
+ {
+ return _inner.GetSchema(collectionName);
+ }
+
+ public override DataTable GetSchema(string collectionName, string[] restrictionValues)
+ {
+ return _inner.GetSchema(collectionName, restrictionValues);
+ }
+
+ public override void Open()
+ {
+ _conRetryPolicy.ExecuteAction(_inner.Open);
+ }
+
+ public override string ServerVersion
+ {
+ get { return _inner.ServerVersion; }
+ }
+
+ public override ConnectionState State
+ {
+ get { return _inner.State; }
+ }
+
+ private void StateChangeHandler(object sender, StateChangeEventArgs stateChangeEventArguments)
+ {
+ OnStateChange(stateChangeEventArguments);
+ }
+
+ public void Ensure()
+ {
+ // verify whether or not the connection is valid and is open. This code may be retried therefore
+ // it is important to ensure that a connection is re-established should it have previously failed
+ if (State != ConnectionState.Open)
+ Open();
+ }
+ }
+
+ class FaultHandlingDbCommand : DbCommand
+ {
+ private RetryDbConnection _connection;
+ private DbCommand _inner;
+ private readonly RetryPolicy _cmdRetryPolicy;
+
+ public FaultHandlingDbCommand(RetryDbConnection connection, DbCommand command, RetryPolicy cmdRetryPolicy)
+ {
+ _connection = connection;
+ _inner = command;
+ _cmdRetryPolicy = cmdRetryPolicy ?? RetryPolicy.NoRetry;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && _inner != null)
+ _inner.Dispose();
+ _inner = null;
+ base.Dispose(disposing);
+ }
+
+ public override void Cancel()
+ {
+ _inner.Cancel();
+ }
+
+ public override string CommandText { get { return _inner.CommandText; } set { _inner.CommandText = value; } }
+
+ public override int CommandTimeout { get { return _inner.CommandTimeout; } set { _inner.CommandTimeout = value; } }
+
+ public override CommandType CommandType { get { return _inner.CommandType; } set { _inner.CommandType = value; } }
+
+ protected override DbConnection DbConnection
+ {
+ get
+ {
+ return _connection;
+ }
+ set
+ {
+ if (value == null) throw new ArgumentNullException("value");
+ var connection = value as RetryDbConnection;
+ if (connection == null) throw new ArgumentException("Value is not a FaultHandlingDbConnection instance.");
+ if (_connection != null && _connection != connection) throw new Exception("Value is another FaultHandlingDbConnection instance.");
+ _connection = connection;
+ _inner.Connection = connection.Inner;
+ }
+ }
+
+ protected override DbParameter CreateDbParameter()
+ {
+ return _inner.CreateParameter();
+ }
+
+ protected override DbParameterCollection DbParameterCollection
+ {
+ get { return _inner.Parameters; }
+ }
+
+ protected override DbTransaction DbTransaction { get { return _inner.Transaction; } set { _inner.Transaction = value; } }
+
+ public override bool DesignTimeVisible { get; set; }
+
+ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
+ {
+ return Execute(() => _inner.ExecuteReader(behavior));
+ }
+
+ public override int ExecuteNonQuery()
+ {
+ return Execute(() => _inner.ExecuteNonQuery());
+ }
+
+ public override object ExecuteScalar()
+ {
+ return Execute(() => _inner.ExecuteScalar());
+ }
+
+ private T Execute(Func f)
+ {
+ return _cmdRetryPolicy.ExecuteAction(() =>
+ {
+ _connection.Ensure();
+ return f();
+ });
+ }
+
+ public override void Prepare()
+ {
+ _inner.Prepare();
+ }
+
+ public override UpdateRowSource UpdatedRowSource { get { return _inner.UpdatedRowSource; } set { _inner.UpdatedRowSource = value; } }
+ }
+}
diff --git a/src/Umbraco.Core/Persistence/LockedRepository.cs b/src/Umbraco.Core/Persistence/LockedRepository.cs
index b5d2d672f2..c067e84288 100644
--- a/src/Umbraco.Core/Persistence/LockedRepository.cs
+++ b/src/Umbraco.Core/Persistence/LockedRepository.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.UnitOfWork;
@@ -7,14 +8,14 @@ namespace Umbraco.Core.Persistence
internal class LockedRepository
where TRepository : IDisposable, IRepository
{
- public LockedRepository(Transaction transaction, IDatabaseUnitOfWork unitOfWork, TRepository repository)
+ public LockedRepository(ITransaction transaction, IDatabaseUnitOfWork unitOfWork, TRepository repository)
{
Transaction = transaction;
UnitOfWork = unitOfWork;
Repository = repository;
}
- public Transaction Transaction { get; private set; }
+ public ITransaction Transaction { get; private set; }
public IDatabaseUnitOfWork UnitOfWork { get; private set; }
public TRepository Repository { get; private set; }
diff --git a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
index ff373df2bf..7f64daa899 100644
--- a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
@@ -2,6 +2,7 @@
using System.Collections.Concurrent;
using System.Linq.Expressions;
using System.Reflection;
+using NPoco;
using Umbraco.Core.Persistence.SqlSyntax;
namespace Umbraco.Core.Persistence.Mappers
diff --git a/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs b/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs
index a622bcda8c..808a932670 100644
--- a/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs
@@ -19,7 +19,7 @@ namespace Umbraco.Core.Persistence.Mappers
public MappingResolver(IServiceContainer container, ILogger logger, Func> assignedMapperTypes)
: base(container, logger, assignedMapperTypes)
{
-
+
}
///
@@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence.Mappers
{
return _mapperCache.GetOrAdd(type, type1 =>
{
-
+
//first check if we can resolve it by attribute
var byAttribute = TryGetMapperByAttribute(type);
@@ -54,7 +54,7 @@ namespace Umbraco.Core.Persistence.Mappers
///
///
private Attempt TryGetMapperByAttribute(Type entityType)
- {
+ {
//check if any of the mappers are assigned to this type
var mapper = Values.FirstOrDefault(
x => x.GetType().GetCustomAttributes(false)
@@ -66,7 +66,7 @@ namespace Umbraco.Core.Persistence.Mappers
}
return Attempt.Succeed(mapper);
- }
+ }
internal string GetMapping(Type type, string propertyName)
{
diff --git a/src/Umbraco.Core/Persistence/Mappers/PetaPocoMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PetaPocoMapper.cs
deleted file mode 100644
index fd516073ce..0000000000
--- a/src/Umbraco.Core/Persistence/Mappers/PetaPocoMapper.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.Reflection;
-
-namespace Umbraco.Core.Persistence.Mappers
-{
- ///
- /// Represents the PetaPocoMapper, which is the implementation of the IMapper interface.
- /// This is currently only used to ensure that nullable dates are not saved to the database.
- ///
- public class PetaPocoMapper : IMapper
- {
- public void GetTableInfo(Type t, TableInfo ti)
- {
- }
-
- public bool MapPropertyToColumn(Type t, PropertyInfo pi, ref string columnName, ref bool resultColumn)
- {
- return true;
- }
-
- public Func